2016-09-09 8 views
0

私はRunnableインターフェイスを実装するクラスMyRunnableを持っています。クラスは、このようにメインスレッドからインスタンス化されます。Runnableの割り込みは他のスレッドにも割り込みを与えますか?

MyRunnable myRunnable = new MyRunnable(); 
Thread thread = new Thread(myRunnable); 
thread.start(); 

MyRunnableがスレッドを停止stop()メソッドを実装しても、現在のスレッドにinterrupt()を呼び出します:スレッドがいくつかの原因中断、しかし

public void stop() 
{ 
    LOG.info("Stopping"); 
    this.runService = false; // reset running flag in order to stop the while-loop 
    Thread.currentThread().interrupt(); // interrupt any blocking operations 
} 

私が理解できない大きな問題。私は、このスレッドだけでなく、メインスレッドを含む他のすべてのスレッドも中断されたことに気づいた!これにより、データベース接続が壊れており、はありません。はこのスレッドなどとやり取りします。割り込み呼び出しを削除すると、すべて正常に動作します。

私はRunnableの作成/開始/停止は非常に簡単だと思っていましたが、何か間違ったことをしていますか?

+2

どのスレッドから 'stop()'メソッドを呼び出していますか? –

+0

メインスレッドから。 –

+0

'interrupt()'は以前に作成したものだけでなく、あなたが呼び出すスレッドを中断します。 –

答えて

3

あなたはおそらくmyRunnable.stop()をメインスレッドから呼び出しています。これにより、Thread.currentThread().interrupt()は単にメインスレッドを中断します。

このメソッドの呼び出しスレッドについては、前提にしないでください。あなたの実行可能ファイルを実行するためにインスタンス化されたスレッドを実際に中断する意図がある場合は、Runnableの実装への参照をどうにかしてを使うのではなく、thread.interrupt()と呼ぶべきです。

+0

ありがとう、それは妥当と聞こえる。 'Runnable'インターフェースを実装するのではなく、' MyRunnable'がjava.lang.Threadを拡張する場合、 'Thread.currentThread()。interrupt()'もメインスレッドを中断しますか?私は内部で 'InterruptException'をキャッチする必要があるので、クラス全体を変更することを考えます。 –

+0

@MarkusLまた、割り込みフラグをチェックするものが必要です。このようなメソッドを呼び出さない限り、InterruptedExceptionはスローされません。 –

関連する問題