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

2020-06-14  本文已影响0人  mysimplebook

线程是一个动态执行的过程,它也有一个从产生到死亡的过程。

主线程从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);

线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。

上一篇下一篇

猜你喜欢

热点阅读