我正在使用 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;
}
}
- 创建这些线程池时,它们是否会使用创建它们的线程来执行提交的任务?
- 如果上述问题的答案是否定的,那么提交要执行的新任务时是否会有延迟?
我指的不是任务执行之前的延迟,因为我知道调度程序无法保证何时执行任务。为了更好地阐明,请参阅以下示例:我在 EDT 上提交任务。提交任务时,EDT 是否会挂起? - 如何判断哪些
ExecutorServices
将使用调用线程,哪些不使用?
你第一个问题的答案确实是:不*。从中创建执行器的线程不受执行程序的控制,因此它不能使用此线程运行任务。
任务的确切执行时间受线程调度程序的约束,并且无法保证何时执行新提交的任务。您不能对调度线程的顺序或确切时间做出任何假设。
*)实际上,这取决于您使用的ExecutorService
的实现。但是大多数实现(例如 Executors.newCachedThreadPool
和 Executors.newScheduledThreadPool
返回的实现)都会创建自己的线程池来运行任务。
要回答第三个问题:查看您正在使用的特定ExecutorService
实现的 API 文档。
是的:执行器可以使用主线程,但您的代码不会。
根据javadoc的说法,执行者的合同是运行一个Runnable。如何做到这一点取决于执行人。
实际上,Executor 的实现(包括您编码要使用的实现)确实使用其他线程,但可以想象,在提交时,执行器只是在调用者线程中立即运行代码。