何とか今何時間かgroovyで作業しているスレッドの単純な割り込みを取得しようとしています。GroovyでJavaスレッドの割り込みがうまくいきません。(Groovyで)
次のコードは、スレッド 'name'に 'interrupted'フラグを設定しません。ループが終わりまで実行されるようにします。
通常、Thread.currentThread().isInterrupted()
のチェックが欠けていた他にも数多くの質問がありました。しかし、これは、ここでそうではありません。
def t = Thread.start('name') {
try {
for (int i = 0; i < 10 && !Thread.currentThread().isInterrupted(); ++i) {
println "$i"
sleep 1000
}
} catch (InterruptedException e) {
println "Catched exception"
Thread.currentThread().interrupt();
}
}
println "Interrupting thread in 1..."
sleep 1000
println "Interrupting thread..."
t.interrupt()
sleep 2000
私は、次の取得の出力
Interrupting thread in 1...
0
Interrupting thread...
1
2
3
4
5
6
7
8
9
私が間違っているの/ここで欠場だろうか? また、ExecutorService
を使用して、返されたFutureにcancel(true)
を呼び出してみました。どちらもうまくいきませんでした。
詳細な説明をありがとうございます。最初の場所では、カスタムフラグを使用して作業していたことに注意してください。しかし、ネットを検索した後、スレッドの実行を中止するために組み込みの割り込み機能を使用すべきであることを伝えるポストが多数見つかりました。しかしおそらくそれはjavaのためのものです。ちょうど解明のために:私は1つのスレッドで書かれ、別のスレッドで読み込まれているフラグの同期に関しては問題に遭遇しませんか? –
ここでJavaやGroovyの違いはありません。私のアドバイスは実際にはJava用ですが、Java上に構築されているGroovyについても同じです。実際には、スレッドの執筆者とタスクは、徹底的に記述されテストされているため、できる限り使用する方が良いです。しかし、はい、安全に変更して複数のスレッドからアクセスできるようにするには、もちろんフラグ変数へのアクセスを同期させる必要があります。 – Vampire