Threadpool重用线程

时间:2018-04-22 09:26:08

标签: java multithreading threadpool java.util.concurrent threadpoolexecutor

我知道这个话题已被问过很多,但我不确定一个细节。 现在,线程池在完成任务后不会让线程死掉,并在以后根据需要重新使用它(因为它被称为herehere等) 但是,假设我的runnable在constuctor中有变量 -

MyRunnable(int a){
  this.a = a; 
}

然后,当我们尝试使用Executors.newFixedThreadPool(或类似的东西)运行Runnable时,我们说

executor.execute(new MyRunnable(a)); // executor being Executors.newFixedThreadPool

现在如果变量'a'在每个执行中都不同,那么Threadpool以后真的可以重用它吗? 我真的不明白这是怎么回事,但我从未见过'Threadpool重用线程除了......',因此引起了混乱。

2 个答案:

答案 0 :(得分:3)

不,您提交的Runnable和与之相关的变量都不会被重复使用。

我认为您误解了ThreadRunnable,它们是不同的东西。 Runnable只是普通对象,当您使用它创建新线程时,将执行其run方法。您可以查看this question

重用线程并不意味着重用Runnable,这意味着线程不断执行不同的Runnable

使用Thread创建Runnable时,start这个帖子是这样的:

new Thread(new Runnable()).start()

run()的{​​{1}}方法将被执行,在Runnale退出后,此run()也将终止。

但是,您提交给Thread的{​​{1}}不是上面代码中构造线程的那个。{/ p>

简而言之,Runnbale中的线程是这样创建的:

ThreadPoolExecutor

注意,用于启动线程的ThreadPoolExecutor不是您提交给池的那个。

当您提交新的Runnable worker = new Runnable() { @Override public void run() { Runnable firstTask = getFirstTask(); // the first runnable firstTask.run(); Runnable queuedTask; while ( (queuedTask = getTaskFromQueue()) != null) { // This could get blocked queuedTask.run(); } } }; new Thread(worker).start(); 时,线程池将检查是否需要创建新线程(基于Runnable之类的参数)。

  • 如果有必要,则创建一个新的Runnable,将corePoolSize设为Worker,然后使用此Runnable创建一个新主题并启动它。
  • 如果没有,则将FirstTask放入队列中。当有空闲线程时,他们将检查此队列并从中获取任务。

答案 1 :(得分:2)

因此,从我的观点来看,线程池工作算法将如何相似,如下所示

while (check if the pool is not shutdown) {
    Runnable task = pool.fetchTaskFromQueue(); // fetch the Task from the queue. In your case it object of MyRunnable class
    task.run(); // call the run() of MyRunnable object
}

线程池重新生成Thread,而不是Runnable/ Callable实现。因此,根据线程池,它会重用您的variable a