当前位置: 首页 > 知识库问答 >
问题:

线程重用

吕嘉荣
2023-03-14
MyRunnable(int a){
  this.a = a; 
}
executor.execute(new MyRunnable(a)); // executor being Executors.newFixedThreadPool

现在,如果变量'a'在每次执行中都不同,Threadpool以后真的可以重用它吗?我无法真正理解这将如何工作,但我从未见过“ThreadPool重用线程,除了...”,因此产生了困惑。

共有1个答案

方俊
2023-03-14

不,您提交的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这样的参数)。

    null
 类似资料:
  • 每个人我对使用线程池有一个误解。实际结果与该类的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如何避免创建新线程?