Rae*_*ald 5 java multithreading unit-testing executor
我正在开发一些最终将使用线程池进行多线程的代码Executor。线程池执行的任务将进行回调并(有时)将进一步的任务提交到任务队列。我想首先开发单线程代码,使其正确(我正在使用测试驱动开发),然后才进行更改以确保线程安全(锁等)。为此,我需要一个Executor可以安全地与非线程安全代码一起使用的代码。
我认为这意味着我需要一个Executor单线程的。也就是说,它导致所有工作都由调用线程完成。JRE 提供这样的吗Executor?或者是否可以将其中一个Executor配置为在该模式下运行?
我已经在使用Humble Object测试模式来测试我的大部分单线程代码。然而,我的一些代码必须与 anExecutor或可能与 an交互ExecutorService,因为它涉及任务的 调度和重新提交,并且它将以一种不平凡的方式进行。测试该代码是这里的挑战。这些任务更新一个共享对象,该对象保存其结果和输入数据。我想推迟使该共享对象线程安全,直到我实现并调试了调度和重新提交代码。
如果代码确实只需要an Executor,而不需要 a (复杂得多)ExecutorService,那么很容易实现您自己的单线程执行器来精确执行所需的操作。API 文档Executor甚至向您展示了如何执行此操作:
class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}
}
Run Code Online (Sandbox Code Playgroud)
如果代码确实需要ExecutorService,则 提供的单线程执行器可能Executors.newSingleThreadExecutor()足以测试非线程安全代码,尽管生成的程序有两个线程(运行单元测试的线程和运行单元测试的单线程池线程)这ExecutorService)。这是因为ExecutorService必须提供以下线程安全保证:
Runnable在将任务或Callable任务提交给发生之前的线程中的操作ExecutorService 中的操作发生在该任务采取的任何操作之前,Future.get()。因此,如果运行单元测试的线程Future.get()对所有提交的任务执行 a 操作,则对任何共享对象的所有更改都将安全发布,并且运行单元测试的线程可以安全地检查这些共享对象。