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

时间:2018-01-17 12:59:30

标签: java multithreading executorservice threadpoolexecutor

假设我有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?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

// 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