【问题标题】:Why my thread did not die?为什么我的线程没有死?
【发布时间】:2014-04-05 04:39:11
【问题描述】:
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 对象)分配给每个玩家以侦听他们传入的输出流,如果有要执行的操作,则从游戏对象中调用一些方法。一切运行良好,但我在想我的游戏线程什么时候会死掉,所以我故意在 PlayerListener 分配完成后设置“return”(但我认为分配完成后,不会有任何语句所以 run 方法会运行反正 )。无论如何,我的游戏仍在运行,我的线程不应该死掉,我的游戏对象也会随之死去吗?

是因为 PlayerListener 对象仍然不时调用游戏对象的方法,所以对象没有被垃圾回收??

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

【问题讨论】:

  • 但是您启动了numPlayer 线程...假设您在run 中的循环实际上是Thread,一旦run 存在,线程就会终止。你有什么证据证明它没有?在剩下的唯一线程是守护线程之前,JVM 不会停止......
  • 是的,这就是关键——您正在运行仍然存在的非守护线程。
  • 因为游戏来自服务器,玩家听服务器(游戏),如果死了,游戏不会向玩家提供信息,但在我的情况下玩家仍然得到响应.所以我猜它没有死?
  • @MadProgrammer 你是说因为 PlayListener(a thread) 对象仍在运行,所以只要 PlayListener 对象存在,游戏中的 run 方法就不会死?
  • 如果不知道主要的run 方法是什么(即从 Runnable 或 Thread 或只是一个普通方法实现),不可能 100% 确定,但是虽然有非守护线程在运行,JVM不会退出。在您的示例中,一旦循环完成,run 方法将正常退出

标签: java multithreading


【解决方案1】:

所以我故意在 PlayerListener 分配完成后设置“return”

您的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 线程何时达到“死亡”状态的帖子。它声明“如果 run() 方法返回”,所以我很好奇......

没错。如果您在一个线程的run() 方法中,那么如果run() 方法完成,那么该线程 完成。然而,再一次,循环中派生的线程将保持应用程序运行,除非它们被明确设置为守护线程。

【讨论】:

    【解决方案2】:
    1. “返回;”语句什么也不做,因为它位于 void 方法的末尾(并且编译器会自动将代码添加到 void 方法中,就好像那里有一个“return;”语句)。

    2. 您还没有真正提出明确的问题。你是在问为什么程序没有终止?

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

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

    总而言之,您提供了部分信息的拼凑和部分问题的拼凑。将这两个拼凑在一起已经超出了 Agatha Christie 的能力,更不用说任何完全了解 Java 的人,更不用说这个网站上的人了。

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      相关资源
      最近更新 更多