在固定/缓存的线程池中,可以将多少个 Runnable 添加到队列中?



在固定/缓存线程池中可以添加到队列中的Runnable的数量是否有任何限制?

在我的应用程序中,我试图添加100000个Runnable

for (int i=0; i<100000; i++) {
    executor.execute(new Task(i));
} 

它实际上会处理添加到队列中的所有Runnable吗?还是会抛出一个Exception ?

可以添加到固定/缓存线程池中队列的Runnable的最大数量由分配给JVM的内存决定。

一旦所有内存被消耗,JVM将抛出

线程"main"异常java.lang.OutOfMemoryError: cannot to create new native thread

错误消息。

假设您正在使用java.util.concurrent.Executors.newFixedThreadPool()方法,那么限制是Integer.MAX_INT,至少在OpenJDK实现中是这样。

这个方法的OpenJDK 8实现创建了一个新的LinkedBlockingQueue,默认为Integer.MAX_INT的最大大小。

因此,默认固定线程池中Runnables的最大数目为Integer.MAX_INT。但是请注意,如果您的堆不够大,无法存储那么多Runnables,那么您仍然会受到堆大小的限制。

最新更新