InterruptedException関連の話

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

.@j5ik2o 誰もinterrupt()しないコードに対してInterruptedExceptionを考えるんじゃない、そもそもどうinterrupt()する前提で設計するの、って話で、じゃぁ言語としての挙動をみたらキャンセルぐらいにしか使えないよね、と。

2011-12-04 22:24:00
なぎせ ゆうき @nagise

@j5ik2o 外でしたか。ばーっと書いちゃった。

2011-12-04 22:25:04
加藤潤一(かとじゅん) @j5ik2o

@nagise 割り込みは勝手に起きるもんじゃないというのは同意。fmfm。追っかけて読む そしてつぅぎゃるか

2011-12-04 22:25:31
Suguru ARAKAWA @ashigeru

@nagise @j5ik2o 個人的にはExecutorService使うとshutdownNow()周りでInterruptedExceptionのセマンティクスが終了に向かうことを要求するので、その辺に従ってますね

2011-12-04 22:25:41
なぎせ ゆうき @nagise

InterruptedException をどう捌くよ?の前にどういうふうにinterrupt()するよ?という設計があるはずなのですよ。じゃなけりゃ、そのInterruptedExceptionは高確率で使われないのでどうでもいい :-)

2011-12-04 22:27:33
なぎせ ゆうき @nagise

よく分かんないなら、InterruptedExceptionきたらとりあえず中断して終わらせておけ、と。終わらせるのに変な値とかreturnするぐらいなら、InterruptedExceptionを上に投げ上げておけ、と。

2011-12-04 22:28:59
うらがみ⛄ @backpaper0

ふむふむ……どのようにinterrupt()するか?というのはFuture#cancel(boolean)みたいなことかな

2011-12-04 22:30:29
なぎせ ゆうき @nagise

@ashigeru @j5ik2o むしろ、処理を切り上げて中断する以外の変態的なinterrupt()の使い方を考案するとネタとして面白いかもしれないが、テクニカルで笑いが伝わらない可能性が高い :-)

2011-12-04 22:31:29
Suguru ARAKAWA @ashigeru

@nagise @j5ik2o つーか、ThreadDeathの代わりに使えって書いてある時点でそれ以外の目的に使っちゃいけない気がしなくもない

2011-12-04 22:33:45
なぎせ ゆうき @nagise

@ashigeru @j5ik2o だから世の中的な常識としてはinterrupt()されたら中断しろなんですよ。少なくとも僕はそう理解している

2011-12-04 22:36:19
加藤潤一(かとじゅん) @j5ik2o

@ashigeru ThreadDeathよくしらねーやw 勉強不足だなオレ。ぐぐったらJavaHouseとか出てきたw

2011-12-04 22:36:30
Suguru ARAKAWA @ashigeru

@j5ik2o Thread.stopでしらべたほうがいいかも

2011-12-04 22:39:58
なぎせ ゆうき @nagise

僕はデーモンスレッドって怖くてあんまり使わないんだよな。どこで中断されるかよく分かんなくて。明確な終了条件があるならThread.interrupt()して止まらせればいいし、それができないなら仕方ないからシャットダウンフックを使う

2011-12-04 22:43:34
なぎせ ゆうき @nagise

@ashigeru @j5ik2o Thread.stopとか1.0時代でしょ。僕がJavaやり始めた頃はすでにDeprecatedだったもんなあ…

2011-12-04 22:46:39
加藤潤一(かとじゅん) @j5ik2o

@nagise @ashigeru そのころはWindowsのスレッドを触っていたなー...

2011-12-04 22:48:56
Suguru ARAKAWA @ashigeru

@nagise わたしも現役ではないんですが、あれ実装するかどうかで実行環境の最適化方針が変わって嫌な思い出しかないですね

2011-12-04 22:50:44
なぎせ ゆうき @nagise

そもそもThread.sleep()がどう割り込まれるとか実は結構どうでもよくて。というのはThread.sleep()で待機するシチュエーションが少ない。Thread.join()とかObject.wait()とかでしょ。いや今ならconcurrentパッケージだな

2011-12-04 22:51:58
なぎせ ゆうき @nagise

そういえばシャットダウンフックも知名度が今ひとつかもなあ。java.lang.Runtime#addShutdownHook() http://t.co/Mb6asqwp

2011-12-04 23:00:27
sipadan @sipadan2003

多くは誰よ?という状態。その誰が判る例として、java.concurrent.ExecutorServiceがある。WorkManager APIならキャンセルする仕組みがない QT @j5ik2o: @nagise 契約者(クライアント)は誰よ?ってのが見えないと的を得ない議論

2011-12-05 00:46:58
なぎせ ゆうき @nagise

氏の意図が読めない。Thread内部状態は外から分からないし QT @sipadan2003 sleep()やwait()をinterruptするのであって、スレッドをinterruptするのではないです。notify()、notifyAll()でスレッドを再開するのですから。

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

そもそもnotify()とinterruptは似て非なる機構だし。Threadオブジェクトに対しinterruptする時、sleep状態なのか、何かしらの命令の実行中かは分からないわけで、それを意識してinterruptする時点で設計がマズイ QT @sipadan2003

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

.@sipadan2003 氏との焦点は、氏は自分のコントロール下にない何がinterrupt()の主体であると想定していて、僕はコントロール下と想定していることっぽい。

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

.@sipadan2003 氏はExecutorServiceを「誰よ?」っていう状態と表現したけど、ExecutorService#shutdownNow()を呼ぶのが自分のコントロール下のコードなら問題ないし。フレームワーク内部で使われるならその契約に従うべきだし

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

ただまあ、interrupt()されたときにどうするかという契約というのは、結ぶことを忘れられがちではあるかなと思う。考慮漏れするケースが多いかもしれない

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

まとめを読み返すとなんとなく意図が読めてきたぞ。 http://t.co/tL7Oa6oHinterrpt()でスレッドを中断(して終了させる)ものではないと言いたいのか割り込みですからそれは全く正しい。割り込みによっておきるのは分岐であってThreadの終了ではない

2011-12-05 10:47:17