java ThreadPoolExecutor拒绝执行异常

btxsgosb  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(98)

我使用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也没有关闭。
以上错误的原因可能是什么。

qni6mghb

qni6mghb1#

在您的配置中,如果队列已满,并且所有线程都忙碌处理任务,则执行器将拒绝提交给它的任何其他任务。一种解决方案是增加队列大小,以便在线程忙于处理现有任务时允许更多任务排队。或者,您可以考虑使用其他任务调度机制,以便更灵活地控制任务执行。例如调度执行器服务。

相关问题