我使用ThreadPoolExecutor创建了以下执行器
try {
GZIPInputStream gzipIS = new GZIPInputStream(new FileInputStream("filePath"));
BufferedReader reader = new BufferedReader(new InputStreamReader(gzipIS, Charset.forName("UTF-8")));
String line = null;
while ((line = reader.readLine()) != null) {
executor.execute(new ParallelScan(line));
}
} catch (Exception e) {
System.out.printf("\nException == " + e);
}
executor = new ThreadPoolExecutor(
4, 10, 10000000, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(1));
最大池大小为10。但当活动线程计数为0时,它仍然失败。它失败并显示以下错误
java.util.concurrent.RejectedExecutionException: java.util.concurrent.ThreadPoolExecutor@33990a0c[Running, pool size = 10, active threads = 0, queued tasks = 0, completed tasks = 23]
有两个原因导致execute抛出RejectedExecutionException 1。
1.队列已满,无法再添加任何线程
1.线程池已关闭
但在我的场景中却不是这样,队列既没有满,ThreadPool也没有关闭。
以上错误的原因可能是什么。
1条答案
按热度按时间qni6mghb1#
在您的配置中,如果队列已满,并且所有线程都忙碌处理任务,则执行器将拒绝提交给它的任何其他任务。一种解决方案是增加队列大小,以便在线程忙于处理现有任务时允许更多任务排队。或者,您可以考虑使用其他任务调度机制,以便更灵活地控制任务执行。例如调度执行器服务。