2

是否有ExecutorService允许现有线程执行执行而不是产生新线程?如果它是 ScheduledExecutor,则奖励。大多数执行程序会产生工作线程来执行,但我希望工作线程成为我所在的现有线程。这是我想象的API:

while (!executor.isTerminated()) {
    Runnable r = executor.take();
    r.run();
}

这类似于 SWT 和 JavaFX 允许主线程分派事件的方式,与 Swing 不同,后者需要产生自己的事件分派线程来处理事件。

动机:我目前有很多地方线程产生一个新的执行程序,然后调用 awaitTermination() 等待它完成。我想节省一些资源并防止堆栈跟踪被一分为二。

请注意,我不想要在execute(Runnable)的调用者线程中运行任务的执行程序,这就是这个答案和 GuavaMoreExecutors.sameThreadExecutor()所做的。

4

2 回答 2

3

java.util.concurrent 中的大多数执行程序的行为与您的预期完全相同。当任务太多时,有些会产生额外的线程,但通常可以将它们配置为设置限制。

要利用这种行为,不要每次都启动新的执行程序 - 使用相同的执行程序。要等待一组任务完成,请使用invokeAll()submit()然后future.get()

于 2012-09-17T17:46:51.040 回答
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类似 an的单个代码ExecutorCompletionService(请参阅此问题)或使用 fork/join 模式。在 Java 7 中,fork/join 变得更容易(请参阅此 Java trail)。对于 Java 7 之前的代码,请阅读SemaphoreJava 中的计数(以及一般情况下)。

于 2012-09-17T17:37:12.630 回答