今天遇到一个奇怪的问题,在学习JUC(java.util.concurrent)时,不指定线程池的情况下,线程是会使用JVM默认的ForkJoinPool,但是运行的结果,线程编号并不是从1开始的,而是9,比较好奇为什么会出现这种情况。
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
System.out.println(Thread.currentThread().getName());
});
多次运行的结果也还是从9开始,复制一个CompletableFuture同时执行后的结果:
开始我怀疑是可能存在之前的线程没有清除干净导致的,但执行后可以说明,并不是。
分别在两个CompletableFuture中sleep2s,结果不一样了。
CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName());
});
completableFuture1的线程号变为2,completableFuture2的线程号还是9。
插一嘴,我这里是在Spring框架里测试的,所以怀疑可能是Spring初始化的时候有线程跑在了这个方法之前,但是后来新建了maven项目,发现还是从9号开始的。
遗留一下,以后有问题再再复述。