我正在使用2个线程池,每个用于不同的目的(它们的目的与此问题无关)。这些池都是从相同的初始线程创建的,如下所示:
private ScheduledExecutorService pool1
= Executors.newCachedThreadPool(new ManagerFactory(group, "Cached"));
private ExecutorService pool2
= Executors.newScheduledThreadPool(3, new ManagerFactory(group, "Scheduled"));
ManagerFactory
类:
private class ManagerFactory implements ThreadFactory {
private final ThreadGroup group;
private final String name;
private ManagerFactory(ThreadGroup group, String name) {
this.group = group;
this.name = name;
}
@Override
public Thread newThread(Runnable r) {
final Thread t = new Thread(group, r);
t.setName(name + " Manager Thread");
return t;
}
}
ExecutorServices
将使用调用线程哪个不会? 答案 0 :(得分:2)
你的第一个问题的答案确实是:没有*。创建执行程序的线程不受执行程序的控制,因此它不能使用此线程来运行任务。
如果确切执行任务是由线程调度程序决定的,并且无法保证何时执行新提交的任务。您无法对线程的计划顺序或确切时间做出任何假设。
*)实际上,它取决于您正在使用的ExecutorService
的实现。但是大多数实现(例如Executors.newCachedThreadPool
和Executors.newScheduledThreadPool
返回的实现都会创建自己的线程池来运行任务。
回答第三个问题:查看您正在使用的特定ExecutorService
实施的API文档。
答案 1 :(得分:1)
是:执行人员可以使用主线程,但您的代码不会使用。
根据javadoc,执行者的合同是运行Runnable。如何做到这一点取决于执行者。
实际上,Executor的实现 - 包括你编码使用的那些 - 确实使用了其他线程,但可以想象,在提交时,执行者只需在调用者线程中立即运行代码。 p>