InterruptedException関連の話

InterruptedException関連の話。まだ突っ込んでないツイートもあるので、あとで入れる。
7
なぎせ ゆうき @nagise

Threadという実行体で言えばinterrupt()されたところで実行はされ続けるし、ThreadPoolで再利用することができる。が、「処理を中断」をそういうふうに理解されるとはね。

2011-12-05 10:49:23
なぎせ ゆうき @nagise

それで 「notify()、notifyAll()でスレッドを再開する」という表現が出てくるのか。合点が行った。

2011-12-05 10:50:10
なぎせ ゆうき @nagise

曖昧な用語をどう表現すれば誤解が無くなるかは難しいね。広義の意味と狭義の意味をどちらも使うような文になっちゃうともうね。

2011-12-05 11:19:04
Takayoshi Kimura @nekop

Thread.interrupt()を呼んでいいのは、そのスレッドが実行中のライブラリなりソフトウェアなりがThread.interrupt()が呼んでいいよ、その場合こうなるよ、ってちゃんとドキュメントなりなんなりに書いてある場合のみ

2011-12-05 11:22:52
Takayoshi Kimura @nekop

そうではない場合「意図しない動作」の定義ができないので呼んだらどうなるかは運次第だしどうなったところでバグとも呼べない、だからThread.interrupt()はAPIとしてはうんこだし、きちんとしたライブラリはきちんと停止できるようなAPI用意しましょうね

2011-12-05 11:24:07
Takayoshi Kimura @nekop

例えばSocket上でreadしてるようなやつ止めたいんだったらSocket.close()を呼ぶべきで、Thread.interrupt()を呼ぶべきじゃないし、interrupt呼んだ瞬間にそのスレッドが運良くリードループ抜けたらどうするのとか考えてコード書いてるやつ希少

2011-12-05 11:34:46
Takayoshi Kimura @nekop

自分のコードでwait前後だとかIO前後だとか外部からinterrupt()されていた可能性のある全ての場所を考慮してThread.interrupted()をいちいち呼ばなきゃバグだとか言われるのは不条理だしそんなクソAPIに付き合う必要はないと思う

2011-12-05 11:44:49
t_yano @t_yano

あー、なるほど、interrupt()したからってスレッドが終了すべきかどうかとは関係なくて、スレッドが実行してる処理を中断するんだよねって話か。その結果としてスレッドが終了するかしないかはまた別の話だと。そりゃそうだな。

2011-12-05 11:45:06
しいたけ @yuroyoro

「安全にThreadを停止させるには、while文のなかでスレッドの事項状態を表すフラグをチェックしてください」とかJavaDocに書いてあるが、よく考えたらとんでもねー話だ

2011-12-05 11:46:45
アニメ大好きハゲおじさん @Crimson_Apple

JavaってThreadを簡単に利用できるっていうのが一つの売りになってたような気がするんやけど、やっぱりThreadって難しいで…。Threadだけで本が一冊二冊書ける位だからCのポインタくらいには難しいと思っておいたほうがええと今日感じた。

2011-12-05 12:51:30
アニメ大好きハゲおじさん @Crimson_Apple

手前のプログラムを見る限り、正直Threadをしっかりと使いこなしてる気がしない。ただ利用してるだけ。本を読み勉強したけれど段々深みにハマっていくな。いつかぱっと視界が開けりゃいいけど。

2011-12-05 12:54:41