ExecutorService可能会在调用线程上执行吗?

3
如果你阅读了Executor.execute的文档,它会说:
引用: 命令可能会在新线程、池化线程或调用线程中执行,这取决于Executor实现的裁量。
我的理解是,通过调用线程,他们指的是调用execute命令的线程。
在我看来,这种情况从未发生过,所以我的问题是:这真的会发生吗?
由于调用线程控制UI,因此我不能允许在调用线程上进行额外的工作。我特别担心的是,在使用Executors.newFixedThreadPool(threads)方法构建ExecutorService时是否可能发生这种情况。

1
文档说明它取决于执行器的实现。您可以实现自己的执行器,只需调用Runnable.run()即可。 - Blackbelt
2个回答

4

ExecutorService 是一个定义了广泛契约的接口。如果你看一下实现,比如 ThreadPoolExecutor ,你将会有更明确的特性:

一个 ExecutorService ,它使用可能的多个线程池中的一个来执行每个提交的任务,通常是使用 Executors 工厂方法进行配置。

请注意,上面链接的 javadoc 明确说明了各种 Executors 工厂方法返回的 ExecutorServiceThreadPoolExecutor

因此,更直接地回答你的问题:Executors.newFixedThreadPool(threads) 不会在调用线程上执行任务。


2
除了其他答案之外,这段引用来自Executor javadoc,提供了一个Executor实现的示例,它在调用线程中运行代码。
然而,Executor接口并不严格要求执行是异步的。在最简单的情况下,执行器可以立即在调用者的线程中运行提交的任务。
class DirectExecutor implements Executor {    
    public void execute(Runnable r) {
        r.run();    
    }  
}

更典型的情况是,在调用者线程之外的某个线程中执行任务。下面的执行器为每个任务生成一个新线程。

通常情况下,任务在调用者线程以外的其他线程中执行。下面的执行器为每个任务创建一个新的线程。

class ThreadPerTaskExecutor implements Executor {    
    public void execute(Runnable r) {
        new Thread(r).start();    
    }  
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接