繁体   English   中英

如何按需挂起Java线程?

[英]How do I suspend java threads on demand?

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

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

因此,一般而言,按需暂停或继续执行线程的方式是什么?

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

也许我错过了要点,但是如果他们无事可做,为什么不让他们死呢? 然后,当您有工作要做时再生成一个新线程。

在我看来,您似乎想双向进行对话。 在我看来,您应该要么让工作线程负责向中央线程管理器请求工作(或“模块”),要么应该让中央线程管理器负责完成工作并启动工作线程。

听起来,大多数情况下工作线程负责要求工作。 然后,有时责任转交给线程管理器,告诉工作人员不要再请求一段时间。 我认为,如果这一责任仅停留在一侧,则系统将变得更加简单。

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

在有工作要做时让线程管理器踢工人线程,并跟踪它们的进度,让它们在完成后就死掉,而只有在有新工作要做时才创建新线程。 要么

拥有一定数量的始终存在的工作线程,这些线程轮询线程管理器进行工作,并在没有再次尝试之前使用Thread.sleep()休眠一段时间(如果没有)。 这对我来说似乎很浪费,因此除非您有充分的理由不这样做,否则我会倾向于选择1。

在不回答您的问题的大传统下,建议您做错了,我提供此:-)

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

有很多方法可以做到这一点,但是在最普通的(IMO)中,工作线程在工作队列上调用wait(),而工作生成器应在调用notify()时。 这将导致工作线程停止,而线程管理器不执行任何操作。 参见例如这篇关于线程池和工作队列的文章

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

poll(time,unit)以等待超时,这样您就可以干净地关机

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM