2012-12-04 35 views
16

我刚开始考虑Java的Executors类和newCachedThreadPool()方法。根据API,生成的线程池将重新使用现有的Thread对象来执行新任务。缓存线程池如何重用现有线程

我有点困惑,这是如何实现的,因为我找不到Thread API中的任何方法,它允许您设置现有Thread对象的行为。

例如,你可以从一个Runnable对象,这使得Thread呼叫Runnablerun()方法创建一个新的Thread。但是,Thread API中没有设置方法,它将Runnable作为参数。

我会很感激任何指针。

+0

答案IOW:一个'Thread'执行几乎相同的任务(或者我应该说任务的子集)作为Runnable和ExecutorService的组合,除了后一个组合为您提供更多功能以利用的。如此以至于你应该真的*考虑你为什么单独使用'Thread'。 – BAR

回答

2

执行者会在后台为您做所有事情。是的,它只使用现有的线程API。

下面链接有使用Thread类和集合API实现的线程池的简单实现:http://www.ibm.com/developerworks/library/j-jtp0730/index.html

+0

由于某种原因,我的第一条评论没有发布。感谢澄清。当我发布这个问题时,我错误地认为这些线程并不知道线程池的内部信息。 –

4

线程池有找工作可运行的线程。该线程不会从Runnable开始一个新线程,而只会调用功能run()。因此,ThreadPool中的线程不是使用您提供的Runnable创建的,而是用于检查是否有任何任务已准备好执行并直接调用它们的线程。

因此,这将是这个样子:

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

当然这是过于简化了等待真正实现更优雅。的信息,如何真正的作品可以在Concurrency in Practice

+0

谢谢。得到它了。 (并感谢所有其他人回答我的问题。) –

2

找到一个伟大的水源井线程只需要拨打其上分配给他的可运行Runnable.run() ...

3

线程都在创建只有一次线程池API(除非线程突然退出某些异常情况除外)

工作线程轮询队列以查看是否有任务并使用它。所以线程永远不会退出。

这只是一个抽象,线程被重用(抽象因为他们从来没有真正停止)。显然,它们在空闲超时和关机请求后停止。

Runnable接口----->线程池(有些工作者线程占用该Runnable和其他等待一些更多的Runnable)

20

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

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

一个简单的解释是,当您将Runnable传递给ExecutorService时,Runnable将放入队列中。 ThreadPool工作线程从此队列读取并调用排队的Runnables run()方法。

+0

谢谢。当我发布这个问题时,我假定'Thread's不知道线程池的实现。 –