Я разрабатываю приложение, которое выполняет, позволяет пользователю настраивать несколько параметров, а затем выполняет вычисление, которое может занять до минуты, после чего оно отображает результат для пользователя.Параллельный алгоритм прерывания и перезапуска вычисления
Я хотел бы, чтобы пользователь мог настроить параметры и перезапустить расчет, завершив ход текущего расчета.
Кроме того, с точки зрения программирования, я хотел бы иметь возможность блокировать до тех пор, пока расчет не будет завершен или прерван, и не сможет узнать, какой из них.
В псевдокоде это примерно то, что я ищу:
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();
}
}
Каков наилучший способ добавить эту функциональность? Или есть лучший способ разработать программу для выполнения всех этих задач?
Это определенно похоже на направление, в котором я хочу пойти, и у меня это работает, но у меня проблемы с отменой текущих вычислений. Сможете ли вы предоставить образец короткого кода? – DanielGibbs