在固定/缓存线程池中可以添加到队列中的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
,那么您仍然会受到堆大小的限制。