gpt4 book ai didi

java - Java线程池抛出RejectedExecutionException的单元测试

转载 作者:行者123 更新时间:2023-11-30 02:41:57 26 4
gpt4 key购买 nike

我刚开始使用 Java 线程池。现在,当新任务到来且当前线程数为最大数且队列已满时,我有一个单元测试用例。我知道在这种情况下会抛出 RejectedExecutionException 。但如何最好地制作这个场景,我现在能想到的是这样的:

LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(1);
ExecutorService ex = new ThreadPoolExecutor(2, 2, 60L, TimeUnit.MILLISECONDS, queue);
int rejected = 0;
try{
while (true){
ex.submit(() -> {
System.out.println("Queue remaining size: " + queue.remainingCapacity());
System.out.println("Thread amount in pool: " + ((ThreadPoolExecutor)ex).getPoolSize() + "\n");
});
}
}
catch (RejectedExecutionException e){
System.out.println(++rejected);
}

这是基本想法,如果正确的话,我需要使用 EasyMock 进行转换。我想知道是否有更好的方法使用 EasyMock 而不是继续提交任务直到线程和队列已满。

最佳答案

This is basic idea and i need to convert this using EasyMock if it is right way. I wonder if there is better way if using EasyMock instead of keep submitting task until thread and queue is full.

EasyMock 所做的任何事情很可能比您的匿名 Runnable 需要更多的代码。你当然可以这样做,但你会使用 IAnswer对象而不是 Runnable所以我不确定它会好多少。

真正的问题是你在测试什么?您真的确定 ThreadPoolExecutor正在做它的工作还是你真的想模拟一个 ExecutorService或者正如@Warren提到的ThreadPoolExecutor .

我会做 Thread.sleep(1000)在你的Runnable并提交其中 4 个而不是 while环形。您还可以在开始时创建一个对象并多次提交。请原谅 Java 7 代码:

BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(1);
ExecutorService ex = new ThreadPoolExecutor(2, 2, 60L, TimeUnit.MILLISECONDS, queue);
Runnable runnable = new Runnable() {
@Override
public void run() {
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
}
};
try {
ex.submit(runnable); // 1st thread
ex.submit(runnable); // 2nd thread
ex.submit(runnable); // 1st queued
ex.submit(runnable); // rejected
} catch (RejectedExecutionException e) {
System.out.println("rejected");
}

关于java - Java线程池抛出RejectedExecutionException的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41420617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com