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对象仍不时调用游戏对象的方法,因此该对象不会被垃圾回收?
我读了Java线程何时到达“死”状态的文章。它指出“如果run()方法返回”,那么我很好奇...
所以我故意在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()
方法完成时完成。但是,再次,在循环中分叉的线程将保持应用程序运行,除非将它们专门设置为守护程序线程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句