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

Mar*_*gen 21 java multithreading threadpool

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

我有点疑惑它是如何实现的,因为我在ThreadAPI中找不到任何允许您设置现有Thread对象行为的方法.

例如,您可以创建一个新的 Thread从一个Runnable对象,这使得Thread调用Runnablerun( )方法.但是,ThreadAPI中没有以set Runnable作为参数的setter方法.

我很感激任何指针.

Tud*_*dor 25

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

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


Thi*_*ler 5

线程池具有寻找可运行作业的线程。而不是从Runnable该线程启动一个新线程将只是调用该函数run()。所以 a 中的线程ThreadPool不是用Runnable你提供的创建的,而是一个只检查是否有任何任务准备好执行并直接调用它们的线程。

所以它看起来像这样:

while(needsToKeepRunning()){
    if(hasMoreTasks()){
        getFirstTask().run();.
    }
    else
    {
        waitForOtherTasks();
    }
}
Run Code Online (Sandbox Code Playgroud)

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


rai*_*mar 2

执行者在后台为您做一切事情。是的,它仅使用现有的线程 API。

以下链接包含使用 Thread 类和 Collection API 实现的线程池的示例实现:http://www.ibm.com/developerworks/library/j-jtp0730/index.html