2

そのクラスの割り込みステータスを設定する実行可能なインターフェイスを実装するクラス内にメソッドを設定しようとしています。クラス内から実行できるようにしたい理由は、他にも処理する必要があるクリーンアップがいくつかあるためです。 、 例えば:

Gui gui = new Gui() // class that implements runnable

Thread guiThread = new Thread(gui, "gui thread");

guiThread.start()

...

...

guiThread.interrupt();

gui.cancel();

現在、キャンセル コードは次のようになっていますが、このスレッドの割り込みステータスが正しく設定されていません。

public void cancel()

{

  Thread.currentThread().interrupt();

  // other clean up code here.

}

これを機能させることができるかどうか/どのようにできるかについてのアドバイスはありますか?

ありがとう。

編集:キャンセルを機能させようとしたときに、guiThread.interrupt()をコメントアウトしたので、ステータスをリセットするだけでステータスを設定していませんでした。

4

3 に答える 3

3

単純に interrupt() を呼び出したい - これは、呼び出し元のスレッドではなく、guiThread を中断します。例えば

public void cancel()

{

  guiThread.interrupt();

  // other clean up code here.

}

ただし、呼び出し元のスレッドでクリーンアップ コードを実行してもよろしいですか? 通常は、スレッド自体に独自のクリーンアップを実行させるのが最善です。スレッドがいつ中断され、クリーンアップの準備ができているかはわかりません。中断されたときにスレッドが終了する場合は、interrupt() の後に join() を追加できますが、これは一般に、単にスレッド自体にクリーンアップを実行させるよりも好ましくありません。(後で、これらのタスクに個別のスレッドを用意するのではなく、スレッド プールを使用することさえあるかもしれません。クリーンアップをタスクに組み込むことで、管理がはるかに簡単になります。)

最後に、スレッドが自動的に中断して実行を停止しないことに注意してください。Object.wait()、Thread.sleep() などの割り込みステータスをチェックするメソッドを呼び出すか、明示的にチェックすることができます。 Thread.isInterrupted() による割り込みステータス。

編集: cancel() が guiThread にあると考えました。そうではないので、割り込み呼び出しを変更しました。

于 2010-05-08T23:13:59.123 に答える
2

内部ですべてを実行したい場合はcancel、パラメーターを追加しThreadて guiThread を渡すだけです。

void cancel ( final Thread guiThread )
{
  guiThread.interrupt( );

  guiThread.join( );

  // other cleanup code
  ...
}

発信者コード

Gui gui = new Gui() // class that implements runnable

Thread guiThread = new Thread(gui, "gui thread");

guiThread.start()

...

...

gui.cancel( guiThread );
于 2010-05-08T23:51:23.793 に答える