#java #threadpoolexecutor
#java #threadpoolexecutor
Вопрос:
Многопоточность Java выполняет задачи и явно конструирует ThreadPoolExecutor
, как показано ниже
final ExecutorService threadPool = new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(1), myRejectedExecutionHandler);
и отправляйте задачи следующим образом
for (int i = 0; i < count; i ) {
int articleId = i;
CompletableFuture.supplyAsync(() -> articleId, threadPool);
}
теперь я хочу настроить rejectedExecutionHandler
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
но как я могу получить articleId? потому что я хочу зарегистрировать отклоненный articleId, rejectedExecution
например
log.warn("article: {} is rejected, please process it manually", articleId);
Ответ №1:
Мое решение: не использовать пользовательский RejectedExecutionHandler и перехватить исключение RejectedExecutionException
catchRejectedException(()->CompletableFuture.supplyAsync(() -> articleId, threadPool), articleId);
private void catchRejectedException(Runnable task, int articleId) {
try {
task.run();
} catch (RejectedExecutionException e) {
log.error("article: {} is rejected", articleId, e);
}
}