MyRunnable(int a){
this.a = a;
}
executor.execute(new MyRunnable(a)); // executor being Executors.newFixedThreadPool
现在,如果变量'a'在每次执行中都不同,Threadpool以后真的可以重用它吗?我无法真正理解这将如何工作,但我从未见过“ThreadPool重用线程,除了...”,因此产生了困惑。
不,您提交的runnable
以及与之相关的变量都不会被重用。
我认为您误解了线程
和runnable
,它们是不同的东西。runnable
只是一个普通的对象,execept它的run
方法将在用它创建一个新线程时被执行。你可以检查这个问题。
对thread的重用并不意味着对runnable
的重用,而是意味着该线程继续执行不同的runnable
。
new Thread(new Runnable()).start()
简而言之,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
这样的参数)。
每个人我对使用线程池有一个误解。实际结果与该类的API描述不同。当我在线程池中使用时,它不重用线程,线程池等待构造函数中设置的KeepAliveTime,然后杀死这个线程并创建一个新线程。当我将KeepAliveTime设置为较小值时,比如1秒或更短,它会删除一个线程并重新创建它,但如果我设置一分钟,则不会创建新线程,因为不允许创建,队列已经满,所以所有任务都会被拒绝,但KeepAliveTime
这是我在这里的第一篇文章,提前感谢您的宽容。 我有一个带有作业队列的线程池 工艺流程: 初始化线程池(M 个线程数) 将 N 个任务放入队列中(N 个可以是 问题是同步点。我使用计数器和互斥锁实现了一个简单的信号量:在步骤2之前,计数器用要加载的任务数初始化,当每个任务完成时,计数器递减。如果counter==0,则我从工作线程发送pthread_cond_signal,步骤4中的pthrea德_
我刚刚开始研究Java的类和方法。根据API,生成的线程池重用现有的对象来执行新任务。 我有点困惑这是如何实现的,因为我在API中找不到任何方法可以设置现有对象的行为。 例如,可以从对象创建新的,这使得调用的方法。但是,API中没有将作为参数的setter方法。 我会很感激你的指点。
javadoc表示,重用线程。这怎么可能?一个线程只能通过调用启动一次。那么他们是如何实施的呢?此服务的线程在无限循环中运行,它们的-s会按需更换吗?
问题内容: 我刚刚开始研究Java的类和方法。根据API,生成的线程池将现有对象重用于新任务。 我对此感到有些困惑,因为我无法在API中找到任何方法来设置现有对象的行为。 例如,您可以创建一个 新的 从一个对象,这使得调用的方法。但是,API中没有使用a 作为参数的setter方法。 我将不胜感激任何指针。 问题答案: 执行人员在后台为您完成所有工作。是的,它仅使用现有的线程API。 下面的链接提
我读到有一个线程池,这个池注定要减少创建新线程的成本(至少我这样理解下面的短语): 当您向执行程序发送任务时,它会尝试使用一个池线程来执行此任务,以避免线程的持续生成。[Java7并发Cookbook] 但是,我知道我们没有办法在Java重启线程。 问题:ThreadPoolExecutor如何避免创建新线程?