首页 > 解决方案 > java.util.concurrent.RejectedExecutionException:被 java.util.concurrent.ThreadPoolExecutor 拒绝

问题描述

我有一个集成的执行器服务来同时执行任务,当没有使用时Future,一切正常。为了检查任务是否完成并且执行器线程没有失败,我添加了一个Future并尝试检查失败状态。

示例代码:

val pool = Executors.newFixedThreadPool(THREAD_COUNT)
implicit val context = ExecutionContext.fromExecutorService(pool)

var index = 0
while (index < employeeJobDataList.size()) {
    val startIndex = index
    var endIndex = index + BATCH_THRESHOLD

    if (startIndex + BATCH_THRESHOLD >= employeeJobDataList.size()) {
        endIndex = employeeJobDataList.size()
    }

    val future = Future({
        upsertsFailedBatches.addAll(batchSaveInDDB(employeeJobDataList.subList(startIndex, endIndex), failedList))
    })
    future.onFailure { case e : Throwable => errorFromExecutorService . append (e.toString) }
    index = index + BATCH_THRESHOLD
}

context.shutdown()
while (!context.isTerminated()) {
    Thread.sleep(THREAD_SLEEP_TIME_MILLI)
}

错误详情:

java.util.concurrent.RejectedExecutionException: Task scala.concurrent.impl.CallbackRunnable@74a938eb rejected from java.util.concurrent.ThreadPoolExecutor@5e5fcd94[Shutting down, pool size = 10, active threads = 10, queued tasks = 87323, completed tasks = 213]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
    at scala.concurrent.impl.ExecutionContextImpl$$anon$1.execute(ExecutionContextImpl.scala:136)
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:44)
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:252)
    at scala.concurrent.Promise$class.complete(Promise.scala:55)
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:157)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

标签: multithreadingscalaexecutorserviceexecutor

解决方案


推荐阅读