【发布时间】:2010-07-22 09:33:38
【问题描述】:
我正在寻找一个 java 线程池,它不会同时运行比系统中的内核更多的线程。该服务通常由使用 BlockingQueue 的 ThreadPoolExecutor 提供。
但是,如果计划执行一个新线程,我希望新线程抢占已经运行的线程之一,并将被抢占的线程(处于挂起状态)添加到任务队列中,所以新线程一结束就可以恢复。
有什么建议吗?
【问题讨论】:
-
我认为 Java 线程不应该那样使用,因为不可能暂时停止然后继续线程,除非您自己实现这样的方法。但是没有通用的方法来抢占一个可运行的,暂停执行并让另一个线程继续。事实上,运行的线程数永远不会超过系统中的内核数。这是一个简单的物理定律。如果您运行的线程多于系统中的内核数,java 会自动在运行的线程中调度可用的 CPU(使用抢占)。
-
感谢您的回复。我知道线程暂停在 java 中已被弃用,但是这里已经描述了其他方法:download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/guide/…。我已经实现了一个类似的方法来暂停我的线程。我的目标是尽快完成“新”任务。
标签: java multithreading scheduling