我刚开始看Java的Executors
类和newCachedThreadPool( )
方法。 根据API,产生的线程池重用现有的Thread
为新任务的对象。
我有点疑惑,这是如何实现的,因为我无法找到任何方法Thread
API,可以让你设置一个现有的行为Thread
对象。
例如,您可以创建一个新的 Thread
从一个Runnable
对象,这使得Thread
调用Runnable
的run( )
方法。 然而,存在在没有setter方法Thread
API采用一个Runnable
作为参数。
我会很感激任何指针。
执行人做一切你的背景。 是的它仅使用现有的线程API。
下面链接有线程池的样本实现使用Thread类和集合API实现的: http://www.ibm.com/developerworks/library/j-jtp0730/index.html
基本上想象从池中这样每个线程:
public void run() {
while(true) {
if(tasks available) {
Runnable task = taskqueue.dequeue();
task.run();
} else {
// wait or whatever
}
}
}
线程池有找工作可运行的线程。 相反,从开始一个新的线程Runnable
的线程只会调用函数run()
因此,在一个线程ThreadPool
不与创建Runnable
您提供的,但是有一个,只是检查是否有任何任务准备执行,并直接调用它们。
因此,这将是这个样子:
while(needsToKeepRunning()){
if(hasMoreTasks()){
getFirstTask().run();.
}
else
{
waitForOtherTasks();
}
}
当然,这是过于简化了等待真正实现更优雅。 的信息如何真正起作用,可以在发现了一个伟大源并发编程实践
线程是线程池的API(当由于某种异常的线程突然退出,除了在例)创建一次,
工作线程队列的查询,看看是否有一个任务,并使用它。 所以线程永远不会退出。
这仅仅是线程被重用的抽象(抽象为他们从来没有真正停止)。 显然,他们空闲超时和关闭请求后停止。
可运行----->线程池 (有些工作者线程占用该Runnable和其他等待一些更多的Runnable)
那么线程只需要调用Runnable.run()
上被分配给他的可运行...
一个简化的解释是,当你传递一个Runnable到的ExecutorService了Runnable放入队列。 线程池工作线程从该队列中读取,并调用排队的Runnable run()方法。