Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 CompletableFuture线程池_Java_Multithreading_Completable Future_Forkjoinpool - Fatal编程技术网

使用Java CompletableFuture线程池

使用Java CompletableFuture线程池,java,multithreading,completable-future,forkjoinpool,Java,Multithreading,Completable Future,Forkjoinpool,在下面的代码中,无论我将什么设置为I的最大值,线程总数都不会超过13。它使用什么线程池?在哪里可以找到它的默认设置 public static void main(String[] args) { // write your code here for (int i = 0; i <= 5; i++) { System.out.println("kick off" + i); CompletableFuture.runA

在下面的代码中,无论我将什么设置为I的最大值,线程总数都不会超过13。它使用什么线程池?在哪里可以找到它的默认设置

public static void main(String[] args) {
    // write your code here
    for (int i = 0; i <= 5; i++) {

        System.out.println("kick off" + i);
        CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(1000);

                System.out.println(java.lang.Thread.activeCount());
            }
            catch (Exception e) {
                System.out.println("error");
            }
        });

    }
    System.out.println(java.lang.Thread.activeCount());
    try {
        Thread.sleep(10000);
    }
    catch (InterruptedException e) {
        e.printStackTrace();
    }
}
答复 它由系统设置或当前处理器数量决定

文档和代码 根据以下文件:

所有没有显式执行器参数的异步方法都使用ForkJoinPool.commonPool执行,除非它不支持至少两个并行级别,在这种情况下,将创建一个新线程来运行每个任务。对于子类中的非静态方法,可以通过定义方法defaultExecutor来覆盖该属性。[……]

根据以下文件:

返回公共池实例。这个水池是静态建造的;[……]

从类本身的文档中:

可通过设置以下系统属性来控制用于构造公共池的参数:

java.util.concurrent.ForkJoinPool.common.parallelism—并行级别,非负整数 java.util.concurrent.ForkJoinPool.common.threadFactory—ForkJoinPool.ForkJoinWorkerThreadFactory的类名。系统类加载器用于加载此类。 java.util.concurrent.ForkJoinPool.common.exceptionHandler—Thread.UncaughtExceptionHandler的类名。系统类加载器用于加载此类。 java.util.concurrent.ForkJoinPool.common.maximumSpares—保持目标并行性默认值256所允许的最大额外线程数。 如果没有通过系统属性提供线程工厂,那么公共池将使用一个工厂,该工厂使用系统类加载器作为线程上下文类加载器

从那以后,我们必须检查实际的源代码。发件人:

让我们假设您的机器上有8个内核。因此执行parallelism=Runtime.getRuntime.availableProcessors-1,它将7分配给parallelism。您没有输入if,因此我们继续

接下来是

int n = (parallelism > 1) ? parallelism - 1 : 1;
减去其中一个,所以n=6

然后

Java现在可能使用大约13-8=5个线程作为其他备用线程 它由系统设置或当前处理器数量决定

文档和代码 根据以下文件:

所有没有显式执行器参数的异步方法都使用ForkJoinPool.commonPool执行,除非它不支持至少两个并行级别,在这种情况下,将创建一个新线程来运行每个任务。对于子类中的非静态方法,可以通过定义方法defaultExecutor来覆盖该属性。[……]

根据以下文件:

返回公共池实例。这个水池是静态建造的;[……]

从类本身的文档中:

可通过设置以下系统属性来控制用于构造公共池的参数:

java.util.concurrent.ForkJoinPool.common.parallelism—并行级别,非负整数 java.util.concurrent.ForkJoinPool.common.threadFactory—ForkJoinPool.ForkJoinWorkerThreadFactory的类名。系统类加载器用于加载此类。 java.util.concurrent.ForkJoinPool.common.exceptionHandler—Thread.UncaughtExceptionHandler的类名。系统类加载器用于加载此类。 java.util.concurrent.ForkJoinPool.common.maximumSpares—保持目标并行性默认值256所允许的最大额外线程数。 如果没有通过系统属性提供线程工厂,那么公共池将使用一个工厂,该工厂使用系统类加载器作为线程上下文类加载器

从那以后,我们必须检查实际的源代码。发件人:

让我们假设您的机器上有8个内核。因此执行parallelism=Runtime.getRuntime.availableProcessors-1,它将7分配给parallelism。您没有输入if,因此我们继续

接下来是

int n = (parallelism > 1) ? parallelism - 1 : 1;
减去其中一个,所以n=6

然后


Java现在可能会使用大约13-8=5个线程作为其他备用线程。

您的计算机有多少个处理器?Runtime.getRuntime.AvailableProcessor显示您的计算机上有多个处理器?Runtime.getRuntime.AvailableProcessorsAdmin,您的速度有多快。我想等OP告诉他的处理器数量,这样我可以在我的回答中提到。该死,你跑得多快啊。我想等OP告诉他的处理器数量,这样我就可以在我的回答中提到它。
if (parallelism < 0 && // default 1 less than #cores
    (parallelism = Runtime.getRuntime().availableProcessors() - 1) <= 0)
        parallelism = 1;
int n = (parallelism > 1) ? parallelism - 1 : 1;
n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16;
n = (n + 1) << 1;
System.out.println(java.lang.Thread.activeCount());