ForkJoinPool.commonPool()创建的线程是守护线程吗?
时间: 2023-12-19 17:01:55 浏览: 27
是的,ForkJoinPool.commonPool() 创建的线程都是守护线程。守护线程是一种特殊的线程,当所有的非守护线程结束时,守护线程也会随之结束。在 ForkJoinPool 中,当所有的任务执行完成后,只有守护线程会继续执行,等待新的任务到来。这种设计可以确保程序在所有非守护线程结束后能够正常退出,避免程序无法正常结束的问题。
需要注意的是,如果某个任务创建了新的非守护线程,那么这个新线程不会成为 ForkJoinPool.commonPool() 中的线程,因为 ForkJoinPool.commonPool() 只会创建守护线程。如果需要创建非守护线程,可以通过自定义 ForkJoinPool 对象来实现。
相关问题
ForkJoinPool.commonPool()有什么要注意的吗?
ForkJoinPool.commonPool() 是Java 8中引入的一个线程池,它是一个静态公共池,用于支持ForkJoinTask实现。调用该方法返回的是一个ForkJoinPool对象,该对象默认创建的线程数是当前计算机的处理器个数,可以通过设置系统属性 "java.util.concurrent.ForkJoinPool.common.parallelism" 来改变线程数。使用 ForkJoinPool.commonPool() 时需要注意以下几点:
1. ForkJoinPool.commonPool() 是一个静态公共池,因此它会被所有的ForkJoinTask共享,如果某个ForkJoinTask的执行时间过长,将会阻塞其他任务的执行。
2. ForkJoinPool.commonPool() 的线程数是默认的,如果需要更精细的控制线程数,可以通过创建自定义的ForkJoinPool对象来实现。
3. ForkJoinPool.commonPool() 执行的任务应该是CPU密集型的任务,如果执行的是I/O密集型的任务,可能会导致线程池中的线程阻塞,从而影响系统的性能。
4. ForkJoinPool.commonPool() 的线程数是与处理器相关的,如果处理器的个数发生变化,线程数也会相应地发生变化。因此,在使用 ForkJoinPool.commonPool() 时,应该考虑到处理器数量的变化。
ForkJoinPool.commonPool() 线程池大小
ForkJoinPool.commonPool() 是 Java 中的一个默认线程池实例,它是基于Fork-Join框架实现的。它的大小是根据当前系统的CPU核心数来动态调整的。
在 Java 8 中,默认情况下,ForkJoinPool.commonPool() 的大小是根据 Runtime.getRuntime().availableProcessors() 方法返回的 CPU 核心数来决定的。它的最大线程数默认为 CPU 核心数减一。
但是需要注意的是,如果你调整了 ForkJoinPool.common.parallelism 系统属性,那么它的大小就不再是默认值,而是根据你设置的值来决定。你可以通过 System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "N") 来设置线程池的大小为 N。
总结来说,ForkJoinPool.commonPool() 的线程池大小取决于系统的 CPU 核心数,并且可以通过系统属性进行调整。