2014-02-08 4 views
0

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

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

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

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

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

+0

Это определенно похоже на направление, в котором я хочу пойти, и у меня это работает, но у меня проблемы с отменой текущих вычислений. Сможете ли вы предоставить образец короткого кода? – DanielGibbs

 Смежные вопросы

  • Нет связанных вопросов^_^