2011-11-10 35 views
0

我想中斷正在文件上運行AES加密的線程。這可能需要一段時間,到目前爲止我已經想出了這個。Java - 如何中斷繁忙線程

這個身體是在按鈕激活事件。當用戶再次點擊按鈕時(else子句)。線程應該中斷,但如果我能完全停止線程,我會更高興。但是這已被棄用。

無論如何,線程會忽略.interrupt()並繼續執行aes256File。它確實會引發fileEncryptThread.isInterrupted()標誌,但是從cpu使用情況來看,它仍然會繼續關閉該文件。

我已經閱讀線程安全停車指導,但我不希望完全重新設計我已經慢AES實現被檢查出類的中斷標誌...

fileEncryptThread = new FileThread() // new thread please 
    { 
     @Override 
     public void run() 
     { 
      String result = ""; 
      result = MyCrypto.aes256File(enInPath, 
             enOutPath, 
             charsToString(passT.getPassword()), 
             sec); 
      if (!"".equals(result)) // error handling 
      { 
       JOptionPane.showMessageDialog(null,result); 
      } 
     } 
    }; 
    fileEncryptThread.start(); 
    } 
    else // if stop clicked 
    { 
     fileEncryptThread.interrupt(); 
+0

看起來像你正在使用的實例不是啓動的實例? – r0ast3d

+0

它不應該需要一個完整的重新設計。說實話,如果你的設計不能處理這樣一個簡單的變化,反正你需要一個新的。 **適當的課程設計不是一件小事,甚至比編碼更重要。** – corsiKa

+0

好吧,也許我有點熱情......它需要一個額外的變量和一個條件。和偶爾的任務。我正在尋找是否有另一種方式 – Meltea

回答

2

據我所知,在線程終止的唯一安全方法是從線程的「main」方法返回(通常在Runnable或Thread中運行run())。例如,您可以在MyCrypto.aes256File方法中使用while(<some class member boolean>) -loop,並將布爾值設置爲false,以便線程脫離循環並退出,返回指示進程未完成的值。

4

爲了有效地中斷一個線程,該線程必須以可中斷的方式寫入。也就是說,檢查

Thread.currentThread()。isInterrupted()

布爾,並隨即採取行動。

在您的應用程序,你應該確認

結果= MyCrypto.aes256File(enInPath, enOutPath, charsToString(passT.getPassword()), 秒);

以這種方式行事(如果它的第三方庫,它應該是javadoc'ed)。如果它不可中斷,那麼你會選擇另一個加密實現。

1

另一種可能的方法是(我不太瞭解AES算法),將從加密中分離文件讀數。讀線程會從文件中填充大緩衝區並將它們排列到加密線程。加密線程將處理緩衝區並將'已使用'的隊列排回讀者線程。這允許通過將I/O等待到加密器外部,兩個線程都可以輕鬆停止,同時也可能提高性能,尤其是在多核機器上。加密線程可能永遠不必等待磁盤讀取 - 如果加密線程有足夠的緩衝區存放在隊列中,則讀取器線程暫時等待磁盤頭移動並不重要(即使在單核機)。固定數量的緩衝區和兩個(阻塞的,線程安全的)隊列在閱讀器線程領先於加密器之前提供流量控制。

實際的停止機制然後變得有點微不足道。在避免磁盤延遲方面的收益會壓倒偶爾檢查一面旗子浪費的時間,例如。就在進入下一個緩衝區的隊列之前。

排隊緩衝區也允許向緩衝​​區添加序列號,從而允許所有核心在加密上工作。