Параллельный алгоритм прерывания и перезапуска расчета

Я занимаюсь разработкой приложения, которое позволяет пользователю настраивать несколько параметров, а затем выполняет вычисления, которые могут занять до минуты, после чего он отображает результат для пользователя.

Я бы хотел, чтобы пользователь мог настраивать параметры и перезапускать вычисления, прерывая выполнение текущего расчета.

Кроме того, с точки зрения программирования, я хотел бы иметь возможность блокировать до тех пор, пока расчет не будет завершен или прерван, и уметь знать, какие именно.

В псевдокоде это примерно то, что я ищу:

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, кажется, соответствует вашему требованию: отменяемые асинхронные вычисления с функцией блокировки.

Другие вопросы по тегам