2011-11-10 15 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

まあ、多分私は少し熱心でした...余分な変数と1つの条件が必要になります。そして時折の割り当て。私は別の方法があるかどうかを調べています – Meltea

答えて

2

私の知る限りでは、ありませんスレッドが終了する安全な方法は、スレッドの「主」メソッド(通常はRunnableまたはThreadでrun())から戻ることだけです。たとえば、MyCrypto.aes256Fileメソッド内でwhile(<some class member boolean>) -loopを使用し、booleanをfalseに設定すると、スレッドがループから脱落し、プロセスが完了しなかったことを示す値が返されます。

4

スレッドを効果的に中断させるには、そのスレッドを割り込み可能な方法で書き込む必要があります。つまり、

にThread.currentThread()。isInterruptedを()

ブール値をチェックして、その上に機能しています。あなたのアプリで

、あなたはその

結果= MyCrypto.aes256File(enInPath、 enOutPath、 charsToString(passT.getPassword())、 秒)を確認する必要があります。

は、そのような方法で動作します(サードパーティのライブラリであれば、javadocされている必要があります)。中断しない場合は、暗号化のための別の実装を選択します。

1

可能性がある他のアプローチ(私はAESアルゴリズムがよく分かっていません)は、ファイルを暗号化から読み取って分割します。読み込みスレッドは、ファイルからlarge-ishバッファを埋め、それらを暗号化スレッドにキューイングします。暗号化スレッドはバッファを処理し、「使用済みの」スレッドをリーダスレッドにキューイングします。これにより、両方のスレッドを簡単に停止させることができ、同時にマルチコアマシンでは、暗号化装置からI/O待ちを移動することで、パフォーマンスが向上する可能性があります。暗号化スレッドは、おそらくディスクの読み込みを待つ必要はありません。ディスクヘッドの移動のためのリーダースレッドによる一時的な待機は、暗号化スレッドがキューに入るのに十分なバッファを持っていれば問題ありません(シングルコア機械)。固定数のバッファと2つの(ブロックされたスレッドセーフな)キューは、リーダスレッドが暗号化装置よりも先に進むとフロー制御を提供します。

実際の停止機構はやや些細なものになります。ディスク待ち時間を回避することで、フラグを時折チェックする無駄な時間を浪費するでしょう。次のバッファのキューに移動する直前に実行されます。

キューイングバッファは、バッファにシーケンス番号を追加して、すべてのコアが暗号化に対応できるようにします。

関連する問題