6

ブロッキング関数を使用してプロキシを呼び出すことが主なアクションであるスレッドを実行していて、それが何かを与えるのを待ちます。

揮発性ブール値とInterruptionの既知のパターンを使用しましたが、それが機能するかどうかはわかりません。のcatchブロックを追加しようとするとInterruptedException、エラーが発生します。

InterruptedExceptionの到達不能なcatchブロック。この例外は、tryステートメントの本文からスローされることはありません。

したがって、を取得する予定がない場合InterruptedException、これは、ブロックアクションから抜け出すことができないことを意味します。したがって、停止することはありません。

私は少し戸惑っています。何か案が?

  public void run() {    
    Proxy proxy = ProxyFactory.generateProxy();
    Source source;

    while (!isStopped) {
      try {
        source = proxy.getPendingSources();
        scheduleSource(source);
      } catch (Exception e) {
        log.error("UnExpected Exception caught while running",e);
      }
    }
  }

  public void stop() {
    this.isStopped = true;
    Thread.currentThread().interrupt();
  }
4

5 に答える 5

12

まず、個別のフラグは実際には必要ありません(必要な場合は、AtomicBooleanを使用してください)。while条件としてチェックするだけThread.currentThread().isInterrupted()です。

次に、stopメソッドは正しいスレッドを中断しないため、機能しません。別のスレッドがstopを呼び出す場合、コードはを使用しますThread.currentThread()。これは、実行中のスレッドではなく、呼び出し元のスレッドが中断されることを意味します。

最後に、ブロッキング方法は何ですか?それscheduleSource()ですか?そのメソッドがスローしない場合、InterruptedExceptionそれをキャッチすることはできません。

次のことを試してください。

private final AtomicReference<Thread> currentThread = new AtomicReference<Thread>();

public void run() {
    Proxy proxy = ProxyFactory.generateProxy();
    Source source;

    currentThread.set(Thread.currentThread());

    while (!Thread.currentThread().isInterrupted()) {
        try {
            source = proxy.getPendingSources();
            scheduleSource(source);
        } catch (Exception e) {
            log.error("UnExpected Exception caught while running", e);
        }
    }
}

public void stop() {
    currentThread.get().interrupt();
}
于 2009-11-30T14:38:05.510 に答える
12

いくつかの明確に定義された「ブロッキングメソッド」のみが割り込み可能です。スレッドが中断されると、フラグが設定されますが、スレッドがこれらの明確に定義された中断ポイントの1つに到達するまで、他には何も起こりません。

たとえば、。を使用して作成されたストリームで呼び出された場合read()write()呼び出しは割り込み可能ですInterruptibleChannel。aを開始点として使用する場合、読み取りでブロックされたものを呼び出しても効果はありませんSocket。ブロッキングI/O操作が正常に中断されると、基になるチャネルが閉じられることに注意してください。interrupt()Thread

java.util.concurrent割り込み可能な操作のもう1つの大きなクラスは、パッケージ内のクラスに対するさまざまなブロッキング操作によってスローされる操作です。もちろん、元のwait()方法も中断可能です。

throws InterruptedExceptionブロッキングメソッドは、メソッドシグネチャでを探すことで識別できます。中断の副作用を説明するために、それらも十分に文書化する必要があります。

独自の割り込み可能なメソッドを作成できますが、それは割り込み可能な下位レベルの操作自体で構成されている必要があります。

于 2009-11-30T15:20:48.997 に答える
3

わかりました、人々、これで私を殺さないでください。

私は、スレッドをブロックアクションから追い出し、ThreadDeathをキャッチし、ターゲットスレッドを存続させ、次に進むために、Thread.stop()を試してみました。

動作しているようです。世界は終わりではありません。しかし、私はただ言っているだけです。あなたはあなた自身の行動に責任があります。なぜ私はラップしているのですか?

于 2009-11-30T20:35:40.310 に答える
2

メソッドが間違ったスレッドstopを呼び出しています。中断されているのではなく、中断されているスレッドです。interruptThread.currentThread()

于 2009-11-30T14:38:39.300 に答える
1

実行中のスレッドからどのようにstopを呼び出していますか?
別のスレッドからstop()を呼び出すと、try / catchブロックで実行されているスレッドではなく、そのスレッドを強制終了します。

于 2009-11-30T14:36:31.237 に答える