使用Java CompletableFuture线程池
在下面的代码中,无论我将什么设置为I的最大值,线程总数都不会超过13。它使用什么线程池?在哪里可以找到它的默认设置使用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
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());