2

スレッドが中断されたかどうかを知るために、このソリューションを見つけました。

public class OurThread extends Thread(){
    private volatile boolean stop = false;
    public void run(){
        while (!stop) {
             //Do your actions
        }
     }
 }

しかし、私の run メソッドは 1 回しか実行されないので、while ループの中に入れても意味がありません。私が見つけた別のアプローチは、 Thread.isInterrupted() フラグをチェックしてからスレッドを終了することです。私の run() メソッドはかなり長いので、この状態を何度もチェックする必要があり、コードが汚れています。

これを 4 つの異なるプロセスに適用する必要があるため、よりシンプルでクリーンなソリューションを見つけようとしています。次のようなものがあるかどうかを期待していました:

try{//my code}
catch(interrumption)

問題は、future.cancel() を使用してスレッドが中断されるため、run() コード内で中断がスローされず、それもできないことです。

なにか提案を?スレッドがキャンセルされた場合、今ではコード間で何度もチェックしています。ありがとう :)

4

2 に答える 2

5

まず、スレッドを拡張しないでください。RunnableまたはCallableを実装する必要があります。

次に、次のようなメソッドを追加できます

static void checkInterrupt() {
    if(Thread.currentThread().isInterrupted()) 
         throw new IllegalStateException("Interrupted");
}

これを4か所に置きます。これは多くのコードを追加せず、停止しないタスクほど醜いものではありません。

于 2012-12-18T14:12:45.523 に答える
1

割り込みに応答するメカニズムが組み込まれていない限り、タスク (実行可能または呼び出し可能) を中断することはできません。また、デザインにもよります。たとえば、正確にタスクが中断されると予想される場合。通常、タスクが安全な状態に達したときに行います。

したがって、割り込みが受信されたかどうかを確認してから、適切に応答します。コードを再利用するには、@Peter が提案するアプローチを使用できます。

于 2012-12-18T14:22:19.493 に答える