是否总是需要等待每个线程在实际关闭主线程之前终止?

时间:2014-07-23 12:02:42

标签: java multithreading

假设我有一个主线程和一个普通线程,其执行时间比前一个更多。

喜欢它的东西:

public class Test{
     private int count;

     public void doTest(){
        (new MyThread()).start();

     }
     public static void main(String[] args){
           Test t = new Test();
           t.doTest();
     }

     private class MyThread extends Thread{
            public void run(){
                 while(count < 100){
                     count++;
                     ..wait some secs ...
                 }

            }

     }

}

只留下这样的代码是不对的?或者更正确的是在线程上执行join()以确保它正确结束?

5 个答案:

答案 0 :(得分:7)

这是一个问题,答案是:取决于。

在所有其他线程终止之前,没有技术原因让主线程运行。实际上,您可以像处理其他每个线程一样处理主线程。正如我所建议的那样,当线程已经完成其业务并且可以终止时,没有线程保持活动状态,只启动其他线程的主线程应该在启动其他线程后终止。

提醒:当主线程终止时,JVM本身不会终止。只有在所有非守护程序线程终止时,JVM才会终止。

答案 1 :(得分:1)

完全正常

不需要joinSystem.exit

每个线程都有自己的生命。只要至少有一个线程在运行,程序就会继续运行。

答案 2 :(得分:1)

JVM将自动退出as soon as there are no more non-daemon threads running

如果在启动线程之前没有调用setDaemon(true),则线程完成后JVM将自动退出。无需在线程上调用join(),如果你想要的只是你的线程结束就让进程结束。

答案 3 :(得分:1)

我认为你可能也会在&#34;在所有线程退出之前退出并且#34; /&#34;等待所有线程退出,然后退出主程序&#34;

在开发游戏时,至少在java中,我们需要注意所有线程在主程序退出之前退出。如果你问为什么,那么让我给你解释一个应该为你清楚的例子。

如果有3个主题,则控制游戏的不同方面。

线程1:控制游戏背景声音/音乐/音频。

线程2:控制人工智能。

线程3:控制图形渲染。

考虑到这种情况,如果用户关闭他的游戏,并且如果在关闭之前没有等待线程那么可能存在在游戏的主窗口中关闭的情况,即线程2,线程3但不是线程因此,即使没有看到游戏窗口,你仍然可以播放游戏音乐。这对于任何游戏开发者来说都是非常尴尬的。

答案 4 :(得分:0)

除非线程在无限循环中运行,否则它将在某个时间结束,问题是您是否要等待该线程的终止?您可能要等待如果进一步处理取决于您已启动的线程的结果。如果该线程只做了一些工作并结束,那就离开吧。