执行者是否使用他们创建的线程?

时间:2014-12-15 20:24:45

标签: java multithreading threadpool executorservice

我正在使用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;
    }
}
  1. 创建这些线程池后,他们是否会使用创建的线程来执行提交的任务?
  2. 如果上述答案为否,提交新任务时是否会出现延迟?
    由此我不是指在执行任务之前的延迟,因为我知道调度程序无法保证何时执行任务。为了更好地阐明,请参阅以下示例: 我在EDT上提交了一项任务。在提交任务时,EDT会挂起吗?
  3. 如何判断哪个ExecutorServices将使用调用线程哪个不会?

2 个答案:

答案 0 :(得分:2)

你的第一个问题的答案确实是:没有*。创建执行程序的线程不受执行程序的控制,因此它不能使用此线程来运行任务。

如果确切执行任务是由线程调度程序决定的,并且无法保证何时执行新提交的任务。您无法对线程的计划顺序或确切时间做出任何假设。

*)实际上,它取决于您正在使用的ExecutorService的实现。但是大多数实现(例如Executors.newCachedThreadPoolExecutors.newScheduledThreadPool返回的实现都会创建自己的线程池来运行任务。

回答第三个问题:查看您正在使用的特定ExecutorService实施的API文档。

答案 1 :(得分:1)

是:执行人员可以使用主线程,但您的代码不会使用。

根据javadoc,执行者的合同是运行Runnable。如何做到这一点取决于执行者。

实际上,Executor的实现 - 包括你编码使用的那些 - 确实使用了其他线程,但可以想象,在提交时,执行者只需在调用者线程中立即运行代码。 p>