java - ExecutorService(int n) 和 Thread.activeCount() 是如何工作的?

标签 java multithreading executorservice

我有以下代码片段:

int k = 4;

        ExecutorService e = Executors.newFixedThreadPool(k);
        for (int i = 1; i <= k; i++) {
            e.execute(new C(i));
            e.execute(new C(i));
        }
        int active = Thread.activeCount();
        System.out.println(active);
        e.shutdown();

很明显,我在循环中每次迭代都提交了两个 C。在我的例子中,提交了 8 个 C,即使 ExecutorService 的大小固定为 4。 这也可以通过计算 Activity 线程数 5 来确认。

这种行为是故意的吗?我不明白为什么似乎只有 4 个新线程被启动和计数,尽管提交了 8 个。如果有人能为我澄清 ExecutorService 和 Thread.activeCount() 的概念,我会很高兴。

最佳答案

您创建的 ExecutorService 的主要目标是一个固定大小的线程池(在您的例子中是四个线程)。如果您看到仅为您的八项工作创建了四个 Thread 实例,那么它正在按设计工作。

您似乎认为应该创建八个线程。想象一下,如果您提交了 100 万件作品;如果创建一百万个线程,那将是一场灾难。

抽象允许您控制一次使用多少线程,而不考虑有多少项目要处理。 ExecutorService 处理根据需要多次重复使用四个线程来处理您传递给 execute 调用的所有项目的复杂性。

可以用银行来类比。您创建了一家银行,其中有四个出纳员(线程池中的四个线程)和八个客户(对 execute 的八次调用)。当出纳员完成与客户的交易后,排队的下一位客户将由该出纳员提供服务。您可以通过调用 execute 将某人添加到队列中,ExecutorService 会管理其他一切。您可以通过初始化 ExecutorService 的方式来控制线程(出纳员)的数量(您可以创建许多不同的风格)。

关于java - ExecutorService(int n) 和 Thread.activeCount() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42235904/

相关文章:

带计时器的 JavaScript 游戏

java - 为什么 EasyMock 的 IArgumentMatcher 接口(interface)使用 StringBuffer?

multithreading - Scala List的cons运算符 “::”是线程安全的吗?

java - 抑制 QNMinimizer 的输出

java - Executor在main中运行后如何完成我的程序

java - 识别多线程 MQTT 发布者中的瓶颈

java - 我是否需要对不返回我关心的值的 Future 执行 future.get() ?

java - ExecutorService.awaitTermination() 永远不会超时

java - Java 中的 Process.exitValue()

java - 如何在Eclipse中快速查找/切换到调试当前指令指针