簡體   English   中英

Java-如何中斷繁忙的線程

[英]Java - how to interrupt a busy thread

我試圖中斷正在文件上運行AES加密的線程。 這可能需要一段時間,到目前為止,我已經提出了這個建議。

該主體位於按鈕激活事件內部。 當用戶再次單擊按鈕時(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();

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

Thread.currentThread()。isInterrupted()

布爾值,然后采取行動。

在您的應用中,您應驗證

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

以這種方式操作(如果它是第三方庫,則應使用javadoc'ed)。 如果它不是不可中斷的,則可以選擇另一種實現方式進行加密。

AFAIK,線程終止的唯一安全方法是從線程的“主”方法(通常是Runnable或Thread中的run())返回。 例如,您可以在MyCrypto.aes256File -method中使用while(<some class member boolean>) -loop並將boolean設置為false,這樣線程將退出循環並退出並返回一個值,該值指示進程未完成。

另一種可能的方法(我不太了解AES算法)將從加密中讀取文件分開。 讀取線程將填充文件中較大的緩沖區,並將它們排隊到加密線程中。 加密線程將處理緩沖區,並將“已使用”的緩沖區排隊返回給讀取器線程。 通過將I / O等待移出加密器,這既可以輕松停止兩個線程,又可以提高性能,尤其是在多核計算機上。 加密線程可能永遠不必等待磁盤讀取-如果加密線程在隊列中有足夠的緩沖區(即使在單核上),則讀取器線程臨時等待磁盤磁頭移動也無關緊要。機)。 固定數量的緩沖區和兩個(阻塞,線程安全)隊列可在讀取器線程領先加密器之前提供流控制。

這樣,實際的停止機制就變得微不足道了。 避免磁盤等待時間的收益將使偶爾檢查標志所浪費的時間不堪重負。 就在進入下一個緩沖區的隊列之前。

然后,對緩沖區進行排隊還可以將序列號添加到緩沖區中,從而允許所有內核進行加密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM