如果您阅读Executor.execute的文档,它会说:
该命令可以在Executor实现的判断下在新线程,池化线程或调用线程中执行。
我的理解是,通过调用线程,它们意味着调用execute
命令的线程。
这在我的经历中从未发生过,所以我的问题是:这真的发生过吗?
由于调用Thread控制UI,我不能允许在调用Thread上进行额外的工作。我特别担心当我使用ExecutorService
方法构造Executors.newFixedThreadPool(threads)
时是否会发生这种情况。
ExecutorService
是一个界定广泛合同的界面。如果你看一下实现,例如ThreadPoolExecutor
,你会有更精确的特征:
ExecutorService,使用可能的多个池化线程之一执行每个提交的任务,通常使用Executors工厂方法配置。
请注意,上面链接的javadoc详细说明了各种ExecutorService
工厂方法返回的Executors
s是ThreadPoolExecutor
s。
所以更直接地回答你的问题:Executors.newFixedThreadPool(threads)
不会在调用线程上执行任务。
除了其他答案之外,来自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();
}
}