在阻塞线程上是否有ExecutorService?

时间:2012-09-17 17:29:57

标签: java concurrency executorservice

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

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

这类似于SWT和JavaFX允许主线程分派事件的方式,而不是Swing,它需要生成自己的事件分派线程来处理事件。

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

请注意,我不希望执行程序在execute(Runnable)的调用程序线程中运行任务,这是this answer和Guava的MoreExecutors.sameThreadExecutor()所做的。

2 个答案:

答案 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对象来执行一个任务(这是一个可怕的设计 - 请参阅我的意思的评论),没有简单的方法来实现你想要的。我建议更改代码以使用单个ExecutorExecutorCompletionService(请参阅this question)或使用fork / join模式。在Java 7中,fork / join变得更容易(参见this Java trail)。对于Java 7之前的代码,请阅读Java中的计数Semaphore(以及in general)。