主线程和子线程结束的关系

 我来答
科创17
2022-07-14 · TA获得超过5876个赞
知道小有建树答主
回答量:2846
采纳率:100%
帮助的人:171万
展开全部
线程是一个动态执行的过程,它也有一个从产生到死亡的过程。

主线程从main()方法开始执行,直到main()方法结束后停止JVM。如果主线程中启动了子线程,默认会等待被启动的所有线程都执行完run()方法才终止JVM。

实际上我们可以通过Thread方法来改变主线程和子线程退出的关系。

        如果一个Thread被标志位Daemon线程(守护线程),则所有的非Daemon线程都结束时,JVM才终止。因为从main()方法开始的就是一个非Daemon线程,我们可以将子进程标记为Daemon进程,这样主线程退出时,子线程也会跟着退出。

       默认所有从Daemon线程产生的线程也是Daemon线程,在产生这些新线程的线程停止时,也应该一并跟着停止。

主线程等待启动的子线程都结束之后再结束,只需要在主线程流中启动子线程后,子线程实例调用join()方法。它的意思是子线程使用join()方法加入至当前主线程的流程中,主线程会等待被加入的线程工作完毕,然后再继续它的动作。如

        public static voidmain(String[] args) {

                            Threadt=new Thread(()->{

         // 方法操作

});

t.start();

try{

          t.join();

}catch(InterruptedException e){

         e.printStackTrace();

}

}

       注意join方法需要进行异常捕捉,否则编译报错:

error: unreportedexception InterruptedException; must be caught or declared to be thrown

程序启动后,主线程就开始,在主线程中新建t,并在启动t后,将之加入(join())主线程流程中,所以t会先执行完毕,主线程才会继续原来的流程。

有时候加入的线程可能处理太久,我们可以设定该线程的处理时间,方法就是给join()传入一个整数值n(单位毫秒),表示加入的流程至多可处理n毫秒,过了这个时间,即使没执行完,也不理他了,主线程可继续执行原来的工作流程。

                                                                System.exit(0);

线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式