当前位置:首页 > 生活百科

java启动线程的方法(java同时启动两个线程去执行)

栏目:生活百科日期:2025-02-24浏览:0

定义和概述

Java 中的线程分为两类,分别为daemon 线程(守护线程〉和user 线程(用户线程)。守护线程又称Daemon线程,运行在后台,看不见;用户线程运行在前台,看的见。

在JVM启动时会调用main 函数, main 函数所在的线程就是一个用户线程,其实在JVM内部同时-还启动了好多守护线程, 比如垃圾回收线程。

Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持性工作。这意味着,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的退出。

实际上,在main线程运行结束后,JVM会自动启动一个叫作DestroyJavaVM 的线程,该线程会等待所有用户线程结束后终止JVM 进程。

在Tomcat的NIO实现NioEndpoint中会开启一组接受线程来接受用户的连接请求,以及一组处理线程负责具体处理用户请求,在默认情况下,接受线程和处理线程都是守护线程,这意味着当tomcat 收到shutdown 命令后并且没有其他用户线程存在的情况下tomcat 进程会马上消亡,而不会等待处理线程处理完当前的请求。

2 使用守护线程

在线程start之前,可以通过调用thread.setDaemon(true)将线程设置为Daemon线程。

守护线程有两种结束方式:

守护线程也具有自己的run();方法,当后台线程完成自己的run方法后,守护线程结束。用户线程运行结束,守护线程自动结束。

3 测试案例

public class Daemon {//启动该类,将会构造两条线程,main线程和一条子线程。    public static void main(String&[] args) throws InterruptedException {        //测试非守护线程        //可以看到,输出"main线程结束"之后,子线程还在继续输出,程序没有结束//        test1();        //测试守护线程        //可以看到,输出"main线程结束"之后,子线程没有继续输出,程序结束        test2();    }    /**     * 测试非守护线程     *     * @throws InterruptedException     */    public static void test1() throws InterruptedException {        Thread thread = new Thread(() -&> {            while (true) {                try {                    Thread.currentThread().sleep(500);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println("子线程非守护线程");            }        });        thread.start();        Thread.currentThread().sleep(1000);        System.out.println("main线程结束");    }    //测试守护线程    public static void test2() throws InterruptedException {        Thread thread = new Thread(() -&> {            while (true) {                try {                    Thread.currentThread().sleep(500);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println("子线程守护线程");            }        });        thread.setDaemon(true);        thread.start();        Thread.currentThread().sleep(1000);        System.out.println("main线程结束");    }}复制代码

使用jps查看java进程,可以发现如果子线程是守护线程那么主线程结束,子线程也结束了;如果子线程不是守护线程那么主线程结束,子线程没有结束。

4 注意事项

Daemon线程被用作完成支持性工作,但是在Java虚拟机退出时Daemon线程中的finally块并不一定会执行,如下代码:

public class Daemon {    public static void main(String&[] args) {        Thread thread = new Thread(new DaemonRunner(), "DaemonRunner");        thread.setDaemon(true);        thread.start();    }    static class DaemonRunner implements Runnable {        @Override        public void run() {            try {                SleepUtils.second(10);            } finally {                System.out.println("DaemonThread finally run.");            }        }    }}复制代码

运行Daemon程序,可以看到在控制台上没有任何输出。main线程(非Daemon线程)在启动了线程DaemonRunner之后随着main方法执行完毕而终止,而此时Java虚拟机中已经没有非Daemon线程,虚拟机需要退出。Java虚拟机中的所有Daemon线程都需要立即终止,因此DaemonRunner立即终止,但是DaemonRunner中的finally块并没有执行。

在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源的逻辑。

“java启动线程的方法(java同时启动两个线程去执行)” 的相关文章

iphone发imessage效果(短信切换成iMessage的方法)

iMessage是苹果公司推出的即时通信软件,iMessage可以发送短信、视频等,拥有非常高的安全性。且iMessage不同于运营商短信/彩信业务,用户仅需要...

asf是什么格式的文件格式(asf格式文件转换方法)

从照相机、留声机诞生,解决了人们记录影像、声音的需求以来,人们就不断地追求着在有限的条件下尽可能地提高这些记录的品质,而从模拟时代过渡到数字时代以后,这方面的追...

华硕z270主板接线图解(10秒教你接好机箱与主板)

电脑组装其实并不难,对于一个DIY老手三下五除二就组装好了,但对于新手装机来说,最大的难点就是主板与机箱之间的跳线的接法,那么电脑主板跳线怎么接?下面装机之家小...

akko键盘怎么样(最新评测akko机械键盘)

临近年底,各种总结和方案接踵而至,原本使用的是青轴键盘,但是声音太大了,如果一天不停地打字,我怕无法活着下班,因此决定买一把静音好一点的机械键盘。目标锁定在红轴...

macbook pro装双系统教程(MacBookAir恢复出厂设置)

正式开始:(准备工作)1、新款2016年以后的macbook或pro或imac都可以2、win10镜像文件提前下载好3、电源充上电、连上网(网络不要太卡就好)此...

weui菜鸟使用教程(微信小程序weui文档)

1、使用小程序IDE创建一个空白项目;2、在终端打开新创建的项目,在该目录下使用npm指令:npminitnpminit初始化3、使用npm指令:npminst...

利得行一案结案了吗,盘点利得行最新进展

昨天,杭州市公安局西湖区分局发布警情通告:2019年10月31日,杭州市公安局西湖区分局对吴某群等人涉嫌非法吸收公众存款案立案侦查。现已对吴某群等三人采取刑事强...

qq刷赞网站推广快速(抖音刷赞网免费推广)

24小时抖音自助下单平台就是购买各类抖音业务、抖音点赞、帮助抖音上热门的平台,支持24小时自助刷业务。我们自己也是测试了很多才发现了这么一个好的24小时自助刷业...

大学生创业孵化基地怎么申请,大学生创业孵化政策一览

郧阳网讯十堰市创新创业超市大学生创业孵化园目前正在入驻申报中,凡符合条件的大学生创业项目均可申报,入驻项目在孵化期内免交房租、物业、水电等费用,孵化园免费提供办...

cad标注尺寸设置命令(cad尺寸标注的基本步骤)

.尺寸标注的基本规定1).尺寸线及尺寸界线(1)尺寸线及尺寸界线均以细实线画出。(2)线性尺寸的尺寸线应平行于表示其长度(或距离)的线段。(3)图纸的轮廓线﹑中...