如何按需暂停java线程?

时间:2011-09-05 22:24:52

标签: java multithreading

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

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

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

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

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

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

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

答案 2 :(得分:2)

在没有回答你的问题的传统中,并建议你做错了,我提供: - )

也许您应该重构代码以使用ExecutorService,这是一个相当不错的设计。 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

答案 3 :(得分:1)

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

答案 4 :(得分:1)

使用阻止队列使用take()

获取这些模块

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

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