Параллельный алгоритм прерывания и перезапуска расчета
Я занимаюсь разработкой приложения, которое позволяет пользователю настраивать несколько параметров, а затем выполняет вычисления, которые могут занять до минуты, после чего он отображает результат для пользователя.
Я бы хотел, чтобы пользователь мог настраивать параметры и перезапускать вычисления, прерывая выполнение текущего расчета.
Кроме того, с точки зрения программирования, я хотел бы иметь возможность блокировать до тех пор, пока расчет не будет завершен или прерван, и уметь знать, какие именно.
В псевдокоде это примерно то, что я ищу:
method performCalculation:
interrupt current calculation if necessary
asynchronously perform calculation with current parameters
method performCalculationBlock:
interrupt current calculation if necessary
perform calculation with current parameters
if calculation completes:
return true
if calculation is interrupted:
return false
То, что я имею до сих пор, удовлетворяет первый метод, но я не уверен, как изменить его, чтобы добавить функциональность блокировки:
private Thread computationThread;
private Object computationLock = new Object();
private boolean pendingComputation = false;
...
public MyClass() {
...
computationThread = new Thread() {
public void run() {
while (true) {
synchronized (computationLock) {
try {
computationLock.wait();
pendingComputation = false;
calculate();
} catch (InterruptedException e) {
}
}
}
}
private void checkForPending() throws InterruptedException {
if (pendingComputation)
throw new InterruptedException();
}
private void calculate() {
...
checkForPending();
...
checkForPending();
...
// etc.
}
};
computationThread.start();
}
private void requestComputation() {
pendingComputation = true;
synchronized (computationLock) {
computationLock.notify();
}
}
Каков наилучший способ добавить эту функциональность? Или есть лучший способ разработать программу для выполнения всех этих задач?
1 ответ
Если вы используете JDK 5 или более раннюю версию, проверьте пакет java.util.concurrent. Класс FutureTask, кажется, соответствует вашему требованию: отменяемые асинхронные вычисления с функцией блокировки.