是否有ExecutorService
允许现有线程执行执行而不是生成新线程?奖金,如果它是ScheduledExecutor。大多数执行程序产生工作线程来执行,但我希望工作线程成为我所在的现有线程。这是我想象的API:
while (!executor.isTerminated()) {
Runnable r = executor.take();
r.run();
}
这类似于SWT和JavaFX允许主线程分派事件的方式,而不是Swing,它需要生成自己的事件分派线程来处理事件。
动机:我目前有许多地方,一个线程产生一个新的执行器,然后只是调用awaitTermination()来等待它完成。我想节省一些资源并防止堆栈跟踪被分成两部分。
请注意,我不希望执行程序在execute(Runnable)
的调用程序线程中运行任务,这是this answer和Guava的MoreExecutors.sameThreadExecutor()
所做的。
答案 0 :(得分:3)
java.util.concurrent中的大多数执行程序的行为与您想象的完全相同。有些任务太多,有些会产生额外的线程,但通常可以将它们配置为设置限制。
要利用此类行为,请不要每次都启动新的执行程序 - 使用相同的执行程序。要等待一组任务完成,请使用invokeAll()或submit(),然后future.get()
答案 1 :(得分:0)
我假设您想要的是控制新线程的创建,例如名称,守护程序状态等。使用ThreadFactory
:
public class MyThreadFactory implements ThreadFactory {
public Thread newThread(Runnable runnable) {
Thread t = new Thread(runnable, "MyThreadName");
t.setDaemon(true);
return t;
}
}
这允许您控制线程创建,以便在您制造的线程中执行,而不是从默认ThreadFactory
创建一些默认线程。
然后使用它,Executors
中的所有方法都采用ThreadFactory
:
Executors.newExecutorOfSomeKind(new MyThreadFactory());
编辑:我明白你的意思了。不幸的是,所有Executor
实现的行为(据我所知)是创建新线程来运行任务,除了你提到的sameThreadExecutor
。没有通过创建执行程序的Thread
对象来执行一个任务(这是一个可怕的设计 - 请参阅我的意思的评论),没有简单的方法来实现你想要的。我建议更改代码以使用单个Executor
与ExecutorCompletionService
(请参阅this question)或使用fork / join模式。在Java 7中,fork / join变得更容易(参见this Java trail)。对于Java 7之前的代码,请阅读Java中的计数Semaphore
(以及in general)。