在ThreadPoolExecutor中测试RejectedExecutionHandler

时间:2016-10-07 14:39:19

标签: java multithreading

我如何确保我的rejectedExecution方法有效

 RejectedExecutionHandler() {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            logger.log(Level.INFO, "Name_[" + executorServiceName + "]: All threads busy, processing inline.");
            r.run();
        }
    });

1 个答案:

答案 0 :(得分:2)

我个人会创建一种情况,我的ExecutorService 将始终拒绝任务并检查是否已使用计数器调用此任务。

例如,我的代码可能是这样的:

// A single threaded executor service that cannot have more than 1 task in its task queue
// such that I know that if I provide at least 3 tasks, at least 1 task will be rejected. 
// Why 3? 1 task in the queue + 1 task executed by the thread of the pool 
// = max of tasks that the pool can manage at a given time, so if I add 1 it will be
// rejected.
ExecutorService executor = new ThreadPoolExecutor(
    1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1),
    Executors.defaultThreadFactory(), myHandler
);

// My Counter
AtomicInteger counter = new AtomicInteger();
// Some arbitrary task that lasts long enough to make sure that at least 3
// tasks will be submitted that will increment my counter once completed
Runnable task = () -> {
    try {
        Thread.sleep(1_000L);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        counter.incrementAndGet();
    }
};
try {
    // Submit 3 tasks
    executor.submit(task);
    executor.submit(task);
    executor.submit(task);
} finally {
    // Shutdown the pool and wait until all the submitted tasks have been executed
    executor.shutdown();
    executor.awaitTermination(1L, TimeUnit.MINUTES);
}
// Ensure that we have 3 tasks that have been executed
assertEquals(3, counter.get());