代码之家  ›  专栏  ›  技术社区  ›  Mert Serimer Alumni

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

  •  2
  • Mert Serimer Alumni  · 技术社区  · 8 年前

    假设我有 executor 初始化为:

    ExecutorService es = Executors.newFixedThreadPool(2);
    

    然后我有一个主线程,它将由上面的 执行人 服务 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 是小于2的1吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Kayaman    8 年前

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

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

        2
  •  0
  •   Mena    8 年前

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

    这里有一个简单但丑陋的实验。

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

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

    这意味着您有两个自定义线程正在运行: 主线程 子1 .