我知道这个话题已被问过很多,但我不确定一个细节。 现在,线程池在完成任务后不会让线程死掉,并在以后根据需要重新使用它(因为它被称为here,here等) 但是,假设我的runnable在constuctor中有变量 -
MyRunnable(int a){
this.a = a;
}
然后,当我们尝试使用Executors.newFixedThreadPool
(或类似的东西)运行Runnable时,我们说
executor.execute(new MyRunnable(a)); // executor being Executors.newFixedThreadPool
现在如果变量'a'在每个执行中都不同,那么Threadpool以后真的可以重用它吗? 我真的不明白这是怎么回事,但我从未见过'Threadpool重用线程除了......',因此引起了混乱。
答案 0 :(得分:3)
不,您提交的Runnable
和与之相关的变量都不会被重复使用。
我认为您误解了Thread
和Runnable
,它们是不同的东西。 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
。