当前位置: 首页 > 面试题库 >

ThreadPoolExecutor的maximumPoolSize如何工作?

谭畅
2023-03-14
问题内容

我试图了解ThreadPoolExecutor类。我已经阅读了这个答案和Javadoc。但是我的实验与该描述不符:

我用一个用于跟踪ID的工厂初始化线程池

int tcounter = 0;
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 1, TimeUnit.MINUTES,
        new ArrayBlockingQueue<Runnable>(1000), new ThreadFactory() {

            @Override
            public Thread newThread(Runnable r) {
                return new mThread(tcounter++, r);
            }
        });

public class mThread extends Thread {
    int id;

    private mThread(int id, Runnable run) {
        super(run);
        GLog.e("created thread " + id);
        this.id = id;
    }

}

然后的任务:

public class mRunanble implements Runnable {
    int value = 0;

    private mRunanble(int value) {
        super();
        this.value = value;
    }

    @Override
    public void run() {
        SystemClock.sleep(3000);
        Thread t = Thread.currentThread();
        if (t instanceof mThread) {

            GLog.e("Say " + (value) + " on thread " + ((mThread) t).id);
        }

    }

}

并为按钮分配操作:

executor.execute(new mRunanble(i++));

但是我向该按钮发送了垃圾邮件,并且从不创建第三个线程,因此ThreadPoolExecutor构造函数(maximumPoolSize=4)中的第二个参数是什么。我希望在执行结束1分钟后创建4个线程,并杀死其中2个线程


问题答案:

在ThreadPoolExecutor中,当corePoolSize
no不足以执行您的任务并且如果所有no都被任务占用时,maximumPoolSize就会显示出来,那么只会再创建一个执行任务的踏板。

编辑 您误解了maxPoolsize概念。请参考以下链接。

http://www.bigsoft.co.uk/blog/index.php/2009/11/27/rules-of-a-
threadpoolexecutor-pool-
size



 类似资料:
  • 问题内容: 继续我提出的问题,我试图在我的代码库中使用ThreadPoolExecutor。即使反复尝试从Java API文档中理解,我也无法清楚地理解keepAliveTime要在构造函数中传递的参数的功能/目的。希望有人可以通过一些很好的例子向我解释。 Java文档摘录: keepAliveTime-当线程数大于内核数时,这是多余的空闲线程将在终止之前等待新任务的最长时间。 问题答案: 假设您

  • java.util.concurrent.ThreadPoolExecutor是一个ExecutorService,它使用可能的几个池化线程之一执行每个提交的任务,通常使用Executors工厂方法配置。 它还提供各种实用程序方法来检查当前线程统计信息并控制它们。 ThreadPoolExecutor方法 Sr.No. 方法和描述 1 protected void afterExecute(Run

  • 问题内容: 我的问题: 如何在a上执行一堆线程对象并等待它们全部完成后再继续? 我是ThreadPoolExecutor的新手。因此,此代码是测试以了解其工作方式。现在我什至都不用对象填充,因为我不理解如何在不调用另一个队列的情况下开始队列。无论如何,现在我只是打电话给我,但我认为我仍然缺少一些东西。任何提示都很棒!谢谢。 RunnableObject类: 问题答案: 你应该循环

  • 根据我的理解,ThreadpoolExecitor有两个主要的数据结构(工人,workQueue)用于管理tasks.worker(Set)有线程,这些线程将一直运行到执行器关闭,workerQueue将所有任务保留到执行器。但是根据代码,我没有看到所有任务都被添加到workQ中ueue.task仅在第1361行添加到队列中,不会在每种情况下都执行。

  • 我读到有一个线程池,这个池注定要减少创建新线程的成本(至少我这样理解下面的短语): 当您向执行程序发送任务时,它会尝试使用一个池线程来执行此任务,以避免线程的持续生成。[Java7并发Cookbook] 但是,我知道我们没有办法在Java重启线程。 问题:ThreadPoolExecutor如何避免创建新线程?