Mar*_*gen 21 java multithreading threadpool
我刚刚开始研究Java的Executors类和newCachedThreadPool( )方法.根据API,生成的线程池会Thread为新任务重用现有对象.
我有点疑惑它是如何实现的,因为我在ThreadAPI中找不到任何允许您设置现有Thread对象行为的方法.
例如,您可以创建一个新的 Thread从一个Runnable对象,这使得Thread调用Runnable的run( )方法.但是,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)
线程池具有寻找可运行作业的线程。而不是从Runnable该线程启动一个新线程将只是调用该函数run()。所以 a 中的线程ThreadPool不是用Runnable你提供的创建的,而是一个只检查是否有任何任务准备好执行并直接调用它们的线程。
所以它看起来像这样:
while(needsToKeepRunning()){
if(hasMoreTasks()){
getFirstTask().run();.
}
else
{
waitForOtherTasks();
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这过于简化了,真正的实现与等待要优雅得多。可以在实践中的并发中找到有关其真正工作原理的重要信息来源
执行者在后台为您做一切事情。是的,它仅使用现有的线程 API。
以下链接包含使用 Thread 类和 Collection API 实现的线程池的示例实现:http://www.ibm.com/developerworks/library/j-jtp0730/index.html