运行以下代码,可能会出现java.util.concurrent.RejectedExecutionException
异常。
/**
* -Xmx20m -Xms20m
*
*/
public class SingleThreadPoolTest {
public static void main(String[] args) {
for (int i = 0; i < 20000; i++) {
newSingleThreadPool();
}
}
private static void newSingleThreadPool() {
// create a SingleThreadExecutor then submit a task to it
Executors.newSingleThreadExecutor().submit(new Runnable() {
@Override
public void run() {
byte[] bytes = new byte[1024 * 1024 * 4];
System.out.println(Thread.currentThread().getName());
}
});
}
}
这里的问题是SingleThreadExecutor
对象可以被GC收集,它将执行其finalize
,以便在实例方法submit
完成执行之前关闭线程池。
这似乎违反直觉,会产生错误。 我的问题是,这怎么可能发生?这是GC的正常行为吗?有没有其他语言与GC似乎有问题?
以下是向jdk错误系统报告的错误:Executors.newSingleThreadExecutor().submit(runnable) throws RejectedExecutionException