InterruptedException関連の話
.@j5ik2o 誰もinterrupt()しないコードに対してInterruptedExceptionを考えるんじゃない、そもそもどうinterrupt()する前提で設計するの、って話で、じゃぁ言語としての挙動をみたらキャンセルぐらいにしか使えないよね、と。
2011-12-04 22:24:00@nagise @j5ik2o 個人的にはExecutorService使うとshutdownNow()周りでInterruptedExceptionのセマンティクスが終了に向かうことを要求するので、その辺に従ってますね
2011-12-04 22:25:41InterruptedException をどう捌くよ?の前にどういうふうにinterrupt()するよ?という設計があるはずなのですよ。じゃなけりゃ、そのInterruptedExceptionは高確率で使われないのでどうでもいい :-)
2011-12-04 22:27:33よく分かんないなら、InterruptedExceptionきたらとりあえず中断して終わらせておけ、と。終わらせるのに変な値とかreturnするぐらいなら、InterruptedExceptionを上に投げ上げておけ、と。
2011-12-04 22:28:59@ashigeru @j5ik2o むしろ、処理を切り上げて中断する以外の変態的なinterrupt()の使い方を考案するとネタとして面白いかもしれないが、テクニカルで笑いが伝わらない可能性が高い :-)
2011-12-04 22:31:29@nagise @j5ik2o つーか、ThreadDeathの代わりに使えって書いてある時点でそれ以外の目的に使っちゃいけない気がしなくもない
2011-12-04 22:33:45@ashigeru @j5ik2o だから世の中的な常識としてはinterrupt()されたら中断しろなんですよ。少なくとも僕はそう理解している
2011-12-04 22:36:19@ashigeru ThreadDeathよくしらねーやw 勉強不足だなオレ。ぐぐったらJavaHouseとか出てきたw
2011-12-04 22:36:30僕はデーモンスレッドって怖くてあんまり使わないんだよな。どこで中断されるかよく分かんなくて。明確な終了条件があるならThread.interrupt()して止まらせればいいし、それができないなら仕方ないからシャットダウンフックを使う
2011-12-04 22:43:34@ashigeru @j5ik2o Thread.stopとか1.0時代でしょ。僕がJavaやり始めた頃はすでにDeprecatedだったもんなあ…
2011-12-04 22:46:39@nagise わたしも現役ではないんですが、あれ実装するかどうかで実行環境の最適化方針が変わって嫌な思い出しかないですね
2011-12-04 22:50:44そもそもThread.sleep()がどう割り込まれるとか実は結構どうでもよくて。というのはThread.sleep()で待機するシチュエーションが少ない。Thread.join()とかObject.wait()とかでしょ。いや今ならconcurrentパッケージだな
2011-12-04 22:51:58そういえばシャットダウンフックも知名度が今ひとつかもなあ。java.lang.Runtime#addShutdownHook() http://t.co/Mb6asqwp
2011-12-04 23:00:27多くは誰よ?という状態。その誰が判る例として、java.concurrent.ExecutorServiceがある。WorkManager APIならキャンセルする仕組みがない QT @j5ik2o: @nagise 契約者(クライアント)は誰よ?ってのが見えないと的を得ない議論
2011-12-05 00:46:58氏の意図が読めない。Thread内部状態は外から分からないし QT @sipadan2003 sleep()やwait()をinterruptするのであって、スレッドをinterruptするのではないです。notify()、notifyAll()でスレッドを再開するのですから。
2011-12-05 10:15:03そもそもnotify()とinterruptは似て非なる機構だし。Threadオブジェクトに対しinterruptする時、sleep状態なのか、何かしらの命令の実行中かは分からないわけで、それを意識してinterruptする時点で設計がマズイ QT @sipadan2003
2011-12-05 10:17:58.@sipadan2003 氏との焦点は、氏は自分のコントロール下にない何がinterrupt()の主体であると想定していて、僕はコントロール下と想定していることっぽい。
2011-12-05 10:37:27.@sipadan2003 氏はExecutorServiceを「誰よ?」っていう状態と表現したけど、ExecutorService#shutdownNow()を呼ぶのが自分のコントロール下のコードなら問題ないし。フレームワーク内部で使われるならその契約に従うべきだし
2011-12-05 10:42:26ただまあ、interrupt()されたときにどうするかという契約というのは、結ぶことを忘れられがちではあるかなと思う。考慮漏れするケースが多いかもしれない
2011-12-05 10:43:39まとめを読み返すとなんとなく意図が読めてきたぞ。 http://t.co/tL7Oa6oH はinterrpt()でスレッドを中断(して終了させる)ものではないと言いたいのか。割り込みですからそれは全く正しい。割り込みによっておきるのは分岐であってThreadの終了ではない
2011-12-05 10:47:17