执行程序是否使用创建它们的线程



我正在使用 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将使用调用线程,哪些不使用?

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

任务的确切执行时间受线程调度程序的约束,并且无法保证何时执行新提交的任务。您不能对调度线程的顺序或确切时间做出任何假设。

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

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

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

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

实际上,Executor 的实现(包括您编码要使用的实现)确实使用其他线程,但可以想象,在提交时,执行器只是在调用者线程中立即运行代码。

相关内容

  • 没有找到相关文章

最新更新