美文网首页
主线程和子线程结束的关系

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

作者: mysimplebook | 来源:发表于2020-06-14 11:50 被阅读0次

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

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

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

    相关文章

      网友评论

          本文标题:主线程和子线程结束的关系

          本文链接:https://www.haomeiwen.com/subject/mkjxxktx.html