下面是一个单元测试,它使用ScheduledExecutorService每秒执行一次预定的runnable:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
public class ConcurrentRequestSimulator {
private static final int NUMBER_REQUESTS = 4;
@Test
public void testGetToDoList() {
try {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
scheduler.scheduleAtFixedRate(new RequestThreadInvoker(), 0, 1, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
}
private final class RequestThreadInvoker implements Runnable {
public void run() {
ExecutorService es = Executors.newCachedThreadPool();
for (int i = 1; i <= NUMBER_REQUESTS; i++) {
es.execute(new RequestThread());
}
es.shutdown();
while (!es.isTerminated()) {
}
}
}
private final class RequestThread implements Runnable {
public void run() {
try {
System.out.println("in RequestThread");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
System.out.println("in RequestThread");
中的行RequestThread
似乎没有被调用,因为没有输出显示给控制台。
我认为问题是,由于测试运行完成,导致scheduler
停止调度?可以更新测试,以便scheduler
不会被终止,并且每秒重复调用RequestThreadInvoker
一次吗?
在RequestThreadInvoker
中,我创建了ExecutorService
的新实例。这会导致这个问题吗?
答案 0 :(得分:0)
将Thread.sleep(99000);
添加到测试结束会导致测试等待99秒,这足以让测试运行。
答案 1 :(得分:0)
在线程池运行时,您需要阻止主测试线程(休眠/等待)。要从其中一个单独的线程执行断言,您可以使用类似concurrentunit的内容。