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

如何创建一个ThreadPoolExecutor,根据需要创建线程并在适用时使其过期?

李睿
2023-03-14

我的用例:

  • 为线程池设置最小大小“N”,这意味着“N”个线程在执行器启动后始终可用

我相信HttpClient背后的池管理器也可能有类似的设置。我试图实现它使用ThreadPoolExec导师,但无法找到一种方法。有可能吗?

下面是一个要测试的示例

public class ExecutorExample {

    public static void main(String[] args) throws InterruptedException {
        int minPoolSize = 2;
        int maxPoolSize = 10;
        int ttlMillis = 100;
        ThreadPoolExecutor startupExecutor = new ThreadPoolExecutor(minPoolSize, 
                maxPoolSize, // surprisingly this is not obeyed.
                ttlMillis, 
                TimeUnit.MILLISECONDS, 
                new LinkedBlockingQueue<Runnable>());

        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + startupExecutor.getCorePoolSize());
            startupExecutor.execute(new MyRunnable(i));
        }

        for (int i = 0; i < 20; i++) {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + ":" + startupExecutor.getCorePoolSize());
        }
    }

}

class MyRunnable implements Runnable {

    int n;

    public MyRunnable(int n) {
        this.n = n;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + ":" + n);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

共有1个答案

谷梁德容
2023-03-14

这个怎么样:

        ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);

线程池

编辑:通常我使用的队列是有界阻塞队列。

BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue(queueCapacity, true);

EDIT2:最大池大小仅在队列已满时生效。由于您使用的是无界队列,因此线程数不会超过2。请点击下面的链接。

线程池执行器池大小规则

放上1号,你会看到区别。

new LinkedBlockingQueue<>(1));

编辑3:在您的示例中,更改startupExecutor。getCorePoolSize()startupExecutor。getPoolSize()

 类似资料:
  • 问题内容: 我是线程新手。我想创建一些与主线程分开工作的简单函数。但这似乎不起作用。我只想创建一个新线程,并在那里独立于主线程发生的事情做一些事情。这段代码看起来很怪异,但到目前为止,我对线程的了解还很少。你能解释一下这是怎么回事吗? 问题答案: 您正在线程方法中调用该方法。但是只有在线程已经启动时才调用该方法。改为这样做:

  • 问题 你创建一个工作者线程池,用来响应客户端请求或执行其他的工作。 解决方案 concurrent.futures 函数库有一个 ThreadPoolExecutor 类可以被用来完成这个任务。 下面是一个简单的TCP服务器,使用了一个线程池来响应客户端: from socket import AF_INET, SOCK_STREAM, socket from concurrent.futures

  • 本文向大家介绍如何创建线程池 ?相关面试题,主要包含被问及如何创建线程池 ?时的应答技巧和注意事项,需要的朋友参考一下 在《阿里巴巴 Java 开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。 为什么呢? 使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源开销,解决资源不足的问题。如果不使用线程池,有可能会造成系统创建大量同类线程而

  • 问题内容: 有什么方法可以创建线程以一次运行多个方法吗? 这样,如果任何方法在所有其他线程之间失败,则应终止。 问题答案: 每个node.js进程在设计上都是单线程的。因此,要获得多个线程,您必须具有多个进程(正如其他一些发帖人所指出的那样,您还可以链接到一些库,这些库使您能够使用Node中的线程,但是没有这些库就没有这种能力。请参阅Shawn Vincent的回答,参考https://githu

  • 我正在使用jhipster kafka实现,它使用confluentinc/cp-kafka: 5.4.0映像,当我尝试使用环境变量“KAFKA_CREATE_TOPICS:”创建Kafka主题时,我没有收到任何错误,但主题没有被创建,我在想三种不同的方法来解决这个问题, 通过 docker 撰写文件上的命令创建主题。 将Kafka和动物园管理员的形象更改为另一个像沃尔斯特迈斯特形象的形象。 在

  • 问题内容: 假设我有某种类型: 现在我想基于这种类型创建一个临时表,我该怎么做? 同样,从此:基于用户定义的类型创建表: 问题答案: [\Pure.Krome的答案)显示了如何使用表变量而不是#temp表。如果您确实想要基于已知表类型的#temp表(而不必知道列名/定义),则可以说: 现在,应与表类型的表结构匹配,减去约束(以及从SQL Server 2014开始的边际有用的二级索引)。 当然,随