2011-09-05 39 views
1

我正在研究java中的多线程游戏。我有几个工作线程从中央线程管理器获取模块,然后自行执行它。现在我想暂停这样一个线程,如果它暂时没有任何执行。我已经尝试从线程管理器调用它的wait()方法,但这只会导致它忽略跟随它的notify()调用。如何根据需要暂停Java线程?

我用Google搜索一下就可以了太多,只发现大多数网站是指功能,如暂停(),暂停()等,这些现在被标记一个过时的Java文档页面。

所以一般情况下,按需要暂停或继续线程的方式是什么?

回答

4

您可以在螺纹处,如果你想停止线程的动作被设置为false前哨变量使用if块。如果线程正在执行循环,这效果最好。

1

有很多方法可以做到这一点,但最常见的(IMO),工作线程调用wait()工作队列中,而工作发生器应调用notify()。这会导致工作线程停止,没有线程管理器执行任何操作。见例如this article on thread pools and work queues

2

也许我错过了点,但如果他们什么都没有做,为什么不干脆让他们死?然后在你有工作再做一次时产生一个新线程。

这听起来像你想要双方的对话。在我的(谦虚)意见中,你应该让工作者线程负责要求中央线程管理器工作(或'模块'),或者你应该让中央线程管理器负责分配工作并开始工作线程。

它听起来像是大多数时候工作线程负责请求工作。然后,有时候,责任转向线程经理,告诉工人不要问一段时间。如果这个责任只停留在一边,我认为这个系统会更简单。

因此,考虑到这一点,并用我有限的你开发什么样的知识,我会建议之一:

有工作线程的线程管理器踢时,有事情要做,而且保持自己的进步轨迹,让他们在完成任务时死亡,只有在有新事情发生时才创造新事物。或

一直存在的工作线程轮询的工作线程管理器和集数(如果没有的话)使用的Thread.sleep()重试前一段时间的睡眠。这对我来说似乎很浪费,所以我会倾向于选择1,除非你有充分的理由不去?

+0

这是一个很好的观点,但它仍然会迫使我让游戏的主线程在睡眠或唤醒时等待所有模块执行。另外,由于每个模块(例如AI,动画,3D渲染器,脚本)都需要发送有关完成的反馈,为什么不让他们立即尝试获得新的工作?你确实有一个公平点。我认为它结束了:)但最终哨兵是我实际上寻找的。 – Bartvbl

+0

够公平 - 但我认为这绝对是可行的,没有任何线程必须睡觉。你是对的,没有理由工人不应该在另外一个工作岗位上等待。我认为KarlP是正确的 - 使用ExecutorService。 Java已经拥有一些优秀的并发库时,不需要重新发明轮子。 – Russell

+0

的一部分就是我也想了解这些东西。因此,编程明智可能会更容易,但它是“之前使用它”我以后。当然,我可以完美地让线程死亡,如果他们不能在某个时候获得工作,并在有更多可用时重新生成线程。 – Bartvbl

1

使用阻塞队列使用take()

poll(time,unit)要超时的等待获取这些模块,从而可以正常关闭

这些将阻止当前线程,直到一个模块可用