Если код действительно нуждается в только Executor
, а не (гораздо более сложном) ExecutorService
, легко реализовать собственный однопоточный исполнитель, который делает именно то, что нужно. Документация API Executor
даже показывает вам, как это сделать:
class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}
}
Если для кода требуется ExecutorService
, возможно , что однопотокового исполнителя, предоставленного Executors.newSingleThreadExecutor()
, достаточно для тестирования не поточно-безопасного кода, несмотря на полученная программа имеет два потока (поток, выполняющий модульные тесты, и один поток пула потоков ExecutorService
). Это связано с тем, что ExecutorService
должен обеспечивать следующие гарантии безопасности потока :
- Действия в потоке перед отправкой задачи
Runnable
или Callable
в ExecutorService
случайное до любое действие, выполненное этой задачей,
- , что в свою очередь происходит до , результат получается через
Future.get()
.
Следовательно, если поток, выполняющий модульные тесты, выполняет Future.get()
для всех представленных задач, все изменения в любых общих объектах будут безопасно опубликованы, и поток, выполняющий модульные тесты, может безопасно проверять эти общие объекты.