Executor 的线程池计数是否会影响给定主任务的子任务?

Does Executor's threadpool count affect sub tasks given main task?

假设我有一个 executor 初始化如下:

ExecutorService es = Executors.newFixedThreadPool(2);

然后我有一个主线程,它将由上面的 executor 服务 es 执行。该主线程调用另一个子线程,如下所示:

Thread mainThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    Thread sub1 = new Thread(new Runnable() {
                        @Override
                        public void run() {

                        }
                    });
                    Thread sub2 = new Thread(new Runnable() {
                        @Override
                        public void run() {

                        }
                    });
                    Thread sub3 = new Thread(new Runnable() {
                        @Override
                        public void run() {

                        }
                    });
                    Thread sub4 = new Thread(new Runnable() {
                        @Override
                        public void run() {

                        }
                    });

                    sub1.start();
                    sub2.start();
                    sub3.start();
                    sub4.start();
                }
            });
          es.submit(mainThread);

subTasks 会因为主线程控制器执行器服务 线程池 计数而被性能墙击中吗?因为我指定线程池为 2 但我正在调用 4 个子线程。即使我的主线程 es.submits 是 1 小于 2?

没有。线程池只关心您提交到池中的任务。如果这些任务创建线程或您以其他方式创建线程,则该池不会知道或关心它们。

我希望你不打算编写问题中显示的代码。

由您提交的线程生成的线程不受执行程序限制的影响。

这是一个更简单但丑陋的实验。

// notice only 1 thread in pool here
ExecutorService es = Executors.newFixedThreadPool(1);
Thread mainThread = new Thread(new Runnable() {
    @Override
    public void run() {
        Thread sub1 = new Thread(new Runnable() {
            @Override
            public void run() {
                Thread.getAllStackTraces().keySet().forEach(
                    t -> System.out.println(t.getName())
                );
            }
        });

        sub1.setName("sub1");
        try {
            sub1.start();
            sub1.join();
            System.out.println("mainThread done");
        }
        // swallowing
        catch (InterruptedException ie) {}

    }
});
try {
    es.submit(mainThread);
}
finally {
    es.shutdown();
}

输出(类似...)

Reference Handler
Finalizer
DestroyJavaVM
sub1
pool-1-thread-1
Signal Dispatcher
mainThread done

注意到我将池中的最大线程数更改为 1

这里发生的是你的 mainThread 生成 sub1 并等待它完成,然后打印 mainThread done

sub1 打印在其自身执行期间当前处于活动状态的所有线程名称,而 mainThread 正在等待。

这意味着您有两个自定义线程 运行:mainThreadsub1