如何根据需要挂起java线程?

如何根据需要挂起java线程?,java,multithreading,Java,Multithreading,我正在用java开发一个多线程游戏。我有几个工作线程,它们从中央线程管理器获取模块,然后由中央线程管理器自己执行。现在,我希望能够暂停这样一个线程,如果它暂时没有什么可执行的。我尝试从线程管理器中调用wait()方法,但这只会导致它忽略随后的notify()调用 我也在谷歌上搜索了一下,结果发现大多数网站都引用了suspend()、pause()等函数,这些函数现在在java文档页面上被标记为不推荐使用的函数 因此,一般来说,根据需要暂停或继续线程的方法是什么?如果要暂停线程的操作,可以在线程中

我正在用java开发一个多线程游戏。我有几个工作线程,它们从中央线程管理器获取模块,然后由中央线程管理器自己执行。现在,我希望能够暂停这样一个线程,如果它暂时没有什么可执行的。我尝试从线程管理器中调用wait()方法,但这只会导致它忽略随后的notify()调用

我也在谷歌上搜索了一下,结果发现大多数网站都引用了suspend()、pause()等函数,这些函数现在在java文档页面上被标记为不推荐使用的函数


因此,一般来说,根据需要暂停或继续线程的方法是什么?

如果要暂停线程的操作,可以在线程中使用if块,并将sentinal变量设置为false。如果线程正在执行循环,这种方法效果最好。

如果要停止线程的操作,可以在线程中使用if块,并将sentinal变量设置为false。如果线程正在执行循环,这种方法效果最好。

有很多方法可以做到这一点,但在最常见的情况下(IMO),工作线程调用工作队列上的wait(),而工作生成器应该调用notify()。这会导致工作线程停止,而线程管理器不会执行任何操作。请参见,例如,

有很多方法可以做到这一点,但在最常见的情况下(IMO),工作线程调用工作队列上的wait(),而工作生成器应该调用notify()。这会导致工作线程停止,而线程管理器不会执行任何操作。请看,例如……

也许我没有抓住要点,但是如果他们没事,为什么不让他们死呢?然后,当你有工作要做的时候,产生一个新的线程

在我听来,你好像在试图让对话双向进行。在我(拙见)看来,要么让工作线程负责向中心线程管理器请求工作(或“模块”),要么让中心线程管理器负责分配工作并启动工作线程

这听起来像是大多数时候工作线程负责请求工作。然后,有时,责任会转到线程经理,告诉员工暂时不要要求。我认为,如果这一责任只停留在一方,系统将变得更简单

因此,考虑到这一点,并且我对您正在开发的内容了解有限,我建议:

当有事情要做时,让线程管理器踢工作线程,并跟踪它们的进度,让它们在完成时死去,只有在有新事情要做时才创建新线程。或


在重试之前,使用thread.sleep()设置一定数量的始终存在的工作线程,这些工作线程轮询线程管理器进行工作和(如果没有)睡眠一段时间。这对我来说是相当浪费的,所以我会倾向于选项1,除非你有充分的理由不这样做?

也许我没有抓住要点,但如果他们没事做,为什么不让他们死呢?然后,当你有工作要做的时候,产生一个新的线程

在我听来,你好像在试图让对话双向进行。在我(拙见)看来,要么让工作线程负责向中心线程管理器请求工作(或“模块”),要么让中心线程管理器负责分配工作并启动工作线程

这听起来像是大多数时候工作线程负责请求工作。然后,有时,责任会转到线程经理,告诉员工暂时不要要求。我认为,如果这一责任只停留在一方,系统将变得更简单

因此,考虑到这一点,并且我对您正在开发的内容了解有限,我建议:

当有事情要做时,让线程管理器踢工作线程,并跟踪它们的进度,让它们在完成时死去,只有在有新事情要做时才创建新线程。或


在重试之前,使用thread.sleep()设置一定数量的始终存在的工作线程,这些工作线程轮询线程管理器进行工作和(如果没有)睡眠一段时间。这对我来说似乎相当浪费,所以我倾向于选项1,除非您有充分的理由不这样做?

使用阻塞队列使用

或者等待一段超时时间,以便您可以完全关机


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

使用阻塞队列使用

或者等待一段超时时间,以便您可以完全关机


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

按照不回答您的问题的传统,并表明您做错了,我提供如下:-)

也许您应该重构代码以使用ExecutorService,这是一个相当好的设计。

按照不回答你的问题,并暗示你做错了的伟大传统,我提出以下建议:-)

也许您应该重构代码以使用ExecutorService,这是一个相当好的设计。

您在这里提出的观点很好,但这仍然会迫使我让游戏的主线程在等待所有模块执行时休眠或唤醒。此外,由于每个模块(例如,AI、动画、3D渲染器、脚本)都需要发送有关其完成情况的反馈,为什么不让他们立即尝试一些新的工作?不过你说得很对。我会仔细考虑一下:)但最终哨兵才是我真正想要的。这很公平——但我认为它绝对可以做到,没有任何线程需要睡觉。你说得对,如果有一份工作在等着,工人们没有理由不去接另一份工作。不过我认为KarlP是对的——使用ExecutorService。当Java拥有一些优秀的并发库alr时,就不需要重新发明轮子了