缓存线程池如何重用现有线程

2022-09-01 22:44:21

我刚刚开始研究Java的类和方法。根据 API,生成的线程池会将现有对象重新用于新任务。ExecutorsnewCachedThreadPool( )Thread

我有点困惑这是如何实现的,因为我在API中找不到任何可以让你设置现有对象行为的方法。ThreadThread

例如,您可以从对象创建一个新的,这使得调用成为 的方法。但是,API 中没有将 a 作为参数的 setter 方法。ThreadRunnableThreadRunnablerun( )ThreadRunnable

我将不胜感激任何指示。


答案 1

基本上想象一下池中的每个线程都这样做:

public void run() {
    while(true) {
        if(tasks available) {
           Runnable task = taskqueue.dequeue();
           task.run();
        } else {
           // wait or whatever
        }
    }
}

答案 2

线程池具有查找可运行作业的线程。而不是从线程启动新线程将只调用函数 。因此,a 中的线程不是使用您提供的线程创建的,而是使用一个线程来检查是否有任何任务已准备好执行并直接调用它们。Runnablerun()ThreadPoolRunnable

所以它看起来像这样:

while(needsToKeepRunning()){
    if(hasMoreTasks()){
        getFirstTask().run();.
    }
    else
    {
        waitForOtherTasks();
    }
}

当然,这过于简化,实际实现与等待要优雅得多。有关其实际工作原理的重要信息来源可以在并发实践中找到