永发信息网

如何确保main方法所在的线程是java程序最后结束的线程如何确保

答案:2  悬赏:60  手机版
解决时间 2021-03-05 22:50
如何确保main方法所在的线程是java程序最后结束的线程如何确保
最佳答案
首先先了解如果在main方法中启动多线程,在其他线程均未执行完成之前,main方法线程会不会提前退出呢?答案是肯定的:
1、JVM会在所有的非守护线程(用户线程)执行完毕后退出;
2、main线程是用户线程;
3、仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。
所以如果需要确保main方法所在的线程是JVM中最后结束的线程,这里就需要用到Thread类的join()方法:
在一个线程中启动另外一个线程的join方法,当前线程将会挂起,而执行被启动的线程,知道被启动的线程执行完毕后,当前线程才开始执行。
具体实现可参看代码:
class Thread1 extends Thread  
{  
    public Thread1(String threadName)  
    {     
        super(threadName);  
    }  

    public void run()  
    {  
        System.out.println(getName() + "is running");  
        try  
        {  
            sleep(2000);  
        }   
        catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        }  
    }  
}  

class Thread2 extends Thread  
{  
    private Thread1 thread1;  

    public Thread2(String threadName, Thread1 thread1)  
    {  
        super(threadName);  
        this.thread1 = thread1;       
    }  

    public void run()  
    {  
        System.out.println(getName() +  "is running");  
        try  
        {  
            thread1.start();  
            thread1.join();  
        }   
        catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        }  
        System.out.println("thread2 is over");    
    }  
}  

public class JoinTest  
{  
    public static void main(String[] args)  
    {  
        Thread1 thread1 = new Thread1("Thread1");  
        Thread2 thread2 = new Thread2("Thread2", thread1);  
        thread2.start();  
    }  
}在thead2中调用thread1的join()方法,让thread1中断thread2自身的运行,运行程序首先输出thread2 is running,然后输出thread1 is running, 过了两秒钟之后,才输出thread2 is over,这就说明在thread2中调用thread1的join()方法,thread2自身被中断了,转而执行thread1,等待thread1执行完毕之后,再转过来执行thread2。
全部回答
要实现这个情况,必须知道以下几点 1、java中线程的结束是由run方法运行完成后自动结束的 2、在main线程(主线程)中,需要得到所有线程的引用。 3、知道jdk提供的countdownlatch的用法 例子如下: public static void main(string[] args) throws interruptedexception { //countdownlatch作为计数器纪录有几个线程,例如有2个线程 countdownlatch latch=new countdownlatch(2); worker worker1=new worker( latch); worker worker2=new worker(latch); worker1.start();// 启动线程 worker2.start();// //等待所有工人完成工作 latch.await(); system.out.println("all work done at "+sdf.format(new date())); } class worker extends thread { private countdownlatch latch; public worker(countdownlatch latch) { this.latch = latch; } public void run() { xxxxx //在run方法结束之前,讲线程计数器减一 latch.countdown(); } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
班级上 什么同学会被孤立?
中兴远航4怎么截屏
纳智捷大7跑了7万公里大概值多少钱?
连词成句(注意句末标点符号)(共5小题;每
千奇味蛋糕(中山店)在哪里啊,我有事要去这个
小秦线怎么去啊,有知道地址的么
较为基础的初中英语问题(几道题而已) 要分
第一套房子,86平米,总价66万左右的话。办理
听说太阳穴凹陷面相来说不太好,想去填一下,
重庆到丰都多少公里?走哪条线路最快?
我兄弟三个,我是老三,父母帮两个哥哥盖房成
用升级券升了一级,觉醒任务没了,我也没觉醒
长春新成达建筑构件厂在什么地方啊,我要过去
什么是火碱,小苏打与苏打有什么区别
什么牌子的血压计最耐用和精准啊
推荐资讯
上班一个月不休息是怎样一种体验
国行的网络能连接港版的PS4吗?能够下载游戏
RS具有探测范围大、获取资料快的优点,GIS在
范记永饺子馆我想知道这个在什么地方
龙之谷9月主
马六点火时间不对是啥故障
win7 64位系统安装以后,搜不到无线网怎么办
access 查看vba 工程 提示 “工程不可查看”
【疏不间亲】()识破袁术求亲是“疏不间亲”之
成都金实建设投资有限公司我想知道这个在什么
男猪女蛇婚配
520送花给喜欢的女孩子被拒绝,后面她说不要
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?