2

このスレッドが中断しているかどうかを知りたいだけですか? 間違っていたらヒントをください

public void run(){
  int i;
  while(!Thread.currentThread().isInterrupted()){
    for(i=1;i<=100;i++){

      System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i);

      if(i==3){
        Thread.currentThread().interrupt();
        gotoInform();
        break;
      }
      try{
        Thread.currentThread().sleep(1000);////to sleep the Thread for 1 Second (1000ms)
      }
      catch(Exception e){            
        System.out.printf("Error"+e);            
      }
    }
  }
4

3 に答える 3

8

これは間違っsleepています。スレッドが中断されていることが判明した場合、 がスローされInterruptedException 、中断されたフラグがクリアされるためです。次に、その例外を飲み込み、スレッドが中断されたという記録を抑制します。代わりに、次のように書く必要があります。

public void run(){
    for(int i=1;i<=100;i++){

        System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i);

        if(i==3){
            Thread.currentThread().interrupt();
            gotoInform();
            break;
        }
        try{
            Thread.currentThread().sleep(1000);
        }
        catch(final Exception e){
            e.printStackTrace();
            if(e instanceof InterruptedException) {
                // just in case this Runnable is actually called directly,
                // rather than in a new thread, don't want to swallow the
                // flag:
                Thread.currentThread().interrupt();
            }
            return;
        }
    }
}

(注: これは「実際の」コードではなく、スレッドの割り込みがどのように機能するかを学習しようとしているだけだと思います。「実際の」コードでは、このコードで現在のスレッドを中断する必要はほとんどないはずです。仕方。)

于 2013-05-01T19:04:05.087 に答える
0

このスレッドが中断しているかどうかを知りたいだけですか?

@ruakhは、スローされたスレッドを再中断することは常にInterruptedException良い考えであることは正しいです。

ただし、コードの目的が自己中断であり、他のスレッドが実行中のスレッドを中断しない場合、スレッドが中断された後に が呼び出されるため、sleep()呼び出しに到達することはありませんbreak;

スレッドが常に自己中断される場合は、フラグを使用します。何かのようなもの:

boolean done = false;
while (!done) {
   ...
   if(i==3){
        done = true;
        ...
   }
}

スレッドを中断したとしても、次にgotoInform()which を呼び出すとwait()、 orsleep()自体が呼び出されてInterruptedException. コードが適切に動作し、その場合はスレッドを再中断することを確認する必要があります。

于 2013-05-01T19:09:36.503 に答える