如何做一个缓存的线程池重用现有的线程(How Does a Cached Thread Pool R

2019-07-04 12:02发布

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

我有点疑惑,这是如何实现的,因为我无法找到任何方法Thread API,可以让你设置一个现有的行为Thread对象。

例如,您可以创建一个新的 Thread从一个Runnable对象,这使得Thread调用Runnablerun( )方法。 然而,存在在没有setter方法Thread API采用一个Runnable作为参数。

我会很感激任何指针。

Answer 1:

执行人做一切你的背景。 是的它仅使用现有的线程API。

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



Answer 2:

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

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


Answer 3:

线程池有找工作可运行的线程。 相反,从开始一个新的线程Runnable的线程只会调用函数run() 因此,在一个线程ThreadPool不与创建Runnable您提供的,但是有一个,只是检查是否有任何任务准备执行,并直接调用它们。

因此,这将是这个样子:

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

当然,这是过于简化了等待真正实现更优雅。 的信息如何真正起作用,可以在发现了一个伟大源并发编程实践



Answer 4:

线程是线程池的API(当由于某种异常的线程突然退出,除了在例)创建一次,

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

这仅仅是线程被重用的抽象(抽象为他们从来没有真正停止)。 显然,他们空闲超时和关闭请求后停止。

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



Answer 5:

那么线程只需要调用Runnable.run()上被分配给他的可运行...



Answer 6:

一个简化的解释是,当你传递一个Runnable到的ExecutorService了Runnable放入队列。 线程池工作线程从该队列中读取,并调用排队的Runnable run()方法。



文章来源: How Does a Cached Thread Pool Reuse Existing Threads