Извините за странно сформулированный заголовок, но я столкнулся с интересной проблемой параллелизма в моем тестировании.Вот соответствующий код:
public class CancelableOperation {
boolean canceled;
boolean started;
public void start() {
if (!canceled) {
started = true;
// Kick off actual operation on another thread
}
}
public void cancel() {
if (!started) {
canceled = true;
} else {
// Attempt to cancel the other operation
}
}
}
@Test
public void test() {
CancelableOperation op = new CancelableOperation();
op.start();
while (!op.started) {
Thread.sleep(5);
}
op.cancel();
}
Проблема заключается в том, что cancel()
вызывается после started
, равного true
, но до того, как фактическая операция была запущена в новом потоке.На практике для «фактического» запуска операции требуется около 3 миллисекунд, но этого более чем достаточно для вызова cancel()
в моем тесте.Я, конечно, могу поставить небольшой Thread.sleep()
в тест (после того, как мы определили, что op.started
верно), чтобы дождаться начала операции, но я бы вместо этого изменил свой код, чтобы справиться с этимкрайний случай.
Очевидно, что запуск операции во вторичном потоке является корнем проблемы, но, поскольку операция является длинным, синхронным процессом, перемещение его в этот поток не представляется возможным.Любая помощь будет оценена!