2014-02-08 55 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