如何按需挂起java线程?

我正在研究java中的multithreading游戏。 我有几个工作线程从中央线程管理器获取模块,然后中心线程管理器自己执行它。 现在我希望能暂停这样一个线程,如果暂时没有任何东西可以执行。 我试过从线程管理器上调用wait()方法,但这只会导致它忽略后面的notify()调用。

我在谷歌上搜索了一下,发现大多数网站都引用了诸如suspend(),pause()等函数,这些函数现在在java文档页面上被标记为已弃用。

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

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

也许我错过了这一点,但如果他们无所事事,为什么不让他们死呢? 然后当你为一个人再做一次工作时,会产生一个新线程。

对我来说听起来像是在尝试双向交谈。 在我的(谦逊)意见中,你应该让工作线程负责要求中心线程管理员工作(或“模块”),或者你应该让中心线程管理员负责工作并开始工作线程。

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

所以,鉴于此,并且由于我对您正在开发的内容知之甚少,我建议:

当有东西要做时,让线程管理器踢出工作线程,并跟踪他们的进度,让他们在完成后死掉,只有在有新的东西要做时才创建新的。 要么

在再次尝试之前,使用Thread.sleep()有一定数量的总是存在的工作线程轮询线程管理器以进行工作和(如果没有)hibernate一段时间。 这对我来说似乎很浪费所以我会倾向于选项1,除非你有充分的理由不这样做?

有很多方法可以做到这一点,但在最常见的(IMO)中,工作线程在工作队列上调用wait(),而工作生成器应该调用notify()。 这会导致工作线程停止,线程管理器不做任何事情。 请参阅有关线程池和工作队列的文章 。

使用阻塞队列使用take()获取这些模块

poll(time,unit)进行超时等待,以便您可以彻底关闭

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