我需要对跨线程工作的一些功能进行单元测试,为此我需要保证两个作业在不同的线程上运行.
使用Executors.newCachedThreadPool()引入了竞争条件,因为测试可能会也可能不会使用缓存的线程池.
是否有始终使用新线程的ExecutorService?
解决方法:
使用一个java.util.concurrent.ThreadPoolExecutor
,其corePoolSize为0,keepAliveTime为0.这将使新任务产生一个新线程,线程将在任务终止后立即终止.
例如:
final ExecutorService executorService = new ThreadPoolExecutor(
0, 2, 0, TimeUnit.SECONDS, new SynchronousQueue<>());
executorService.submit(task1);
executorService.submit(task2);