Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行人';s线程池计数是否影响给定主任务的子任务?_Java_Multithreading_Executorservice_Threadpoolexecutor - Fatal编程技术网

Java 执行人';s线程池计数是否影响给定主任务的子任务?

Java 执行人';s线程池计数是否影响给定主任务的子任务?,java,multithreading,executorservice,threadpoolexecutor,Java,Multithreading,Executorservice,Threadpoolexecutor,假设我有一个执行器,其初始化如下: ExecutorService es = Executors.newFixedThreadPool(2); 然后我有一个主线程,它将由上面的executorservicees执行。主线程调用另一个子线程,如下所示: Thread mainThread = new Thread(new Runnable() { @Override public void run() {

假设我有一个
执行器
,其初始化如下:

ExecutorService es = Executors.newFixedThreadPool(2);
然后我有一个主线程,它将由上面的
executor
service
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);

由于主线程控制器执行器服务线程池计数,
子任务是否会被性能墙击中?因为我将线程池指定为2,但我正在调用4个子线程。即使是我提交的主线程
es.submitted
也是小于2的1?

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


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

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

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

// 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();
}
输出(类似于…)

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

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

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


这意味着您有两个自定义线程正在运行:
mainThread
sub1

谢谢。。那么OS/JVM将利用内核来完成子任务?或者我们可以说,它将继续执行它通常对线程执行的操作。是的,在您的示例中,线程池基本上与代码无关。您可以调用
mainThread.start()
,实际上也是一样的。那么“newSingleThreadScheduledExecutor();”的意义是什么呢?它仅用于将来的类使用?当您只需要一个额外的线程来运行异步操作时,它是一种方便的方法。通常,人们使用线程池来获得更高的性能。创建新线程并执行子任务似乎与最初的意图相反
Reference Handler
Finalizer
DestroyJavaVM
sub1
pool-1-thread-1
Signal Dispatcher
mainThread done