为什么我的线程没死?

时间:2014-04-04 01:03:28

标签: java multithreading

public void run() {
        assignPlayer();

        for(int i = 0; i < numPlayers; i++) {
            PlayerListener listener = new PlayerListener(fromPlayer.get(i), this, i);
            new Thread(listener).start();
        }

        return;
}

我正在实施套接字游戏。每个游戏都有2个玩家,每个游戏都有自己的线程。上面的run方法为每个播放器分配PlayerListener(它是一个Runnable对象),用于监听它们的输入输出流,如果有动作要执行,则从游戏对象中调用一些方法。一切都运行良好,但我在想我的游戏线程什么时候会死,所以我故意设置&#34;返回&#34; PlayerListener赋值完成后(但我认为在赋值完成后,将没有语句,因此run方法仍会运行)。无论如何,我的游戏仍然在运行,我的线程不应该死,我的游戏对象会随之死亡吗?

这是因为PlayerListener对象仍然不时地调用游戏对象的方法,所以对象不会被垃圾收集?

我阅读了帖子When does a Java Thread reach the 'Die' State。它声明&#34;如果run()方法返回&#34;,所以我很好奇......

2 个答案:

答案 0 :(得分:2)

  

所以我故意设置&#34;返回&#34; PlayerListener分配完成后

您的return;因其在方法结束时无关紧要。没有它,该方法将返回。如果你专门在每个线程上调用thread.join(),那么线程唯一一次等待它所分叉的线程。

  

无论如何,我的游戏仍然在运行,我的线程不应该死,我的游戏对象会随之死亡吗?

您分叉的线程很可能是非守护程序线程。当JVM退出时,守护程序线程退出,但JVM等待所有非守护程序线程自行退出。当你分叉线程时,它们会占用分叉它们的线程的守护进程状态。如果您希望在run()方法完成后退出这些线程,请说出类似的内容:

Thread thread = new Thread(listener);
// make sure the threads will be killed when all other threads finish
thread.setDaemon(true);
thread.start();
  

我阅读了帖子Java Thread什么时候到达&#39; Die&#39;州。它声明&#34;如果run()方法返回&#34;,所以我很好奇......

右。如果您使用线程的run()方法,那么如果run()方法完成,那么<​​em> 将完成 。但是,在循环中分叉的线程将继续运行应用程序,除非它们被特别设置为守护程序线程。

答案 1 :(得分:1)

  1. “回归”语句不执行任何操作,因为它位于void方法的末尾(并且编译器会自动将代码添加到void方法中,就像那里有“return;”语句一样)。

  2. 你还没有问过一个明确的问题。你在问为什么程序没有终止?

  3. 您没有解释如何调用此特定的“run()”方法。只有当它是线程本身的run()方法,并作为线程启动的一部分调用时,它的返回才会导致线程死亡。

  4. 此外,只要至少有一个非守护程序线程在运行,该过程就不会死亡。

  5. 总而言之,您提供了一些部分信息拼凑而成的拼凑而成的部分问题。将这两个拼凑起来超出了Agatha Christie的能力,更不用说拥有完全Java知识的人了,更不用说这个网站上的人了。