[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends] Re: Thread#interrupt()
Shin@イデアです.
>疑問なのですが、Thread#sleep() や Object#wait() などは
>java.lang.InterruptedException を投げますよね。
>この例外が存在する理由は何なのでしょう?
sleep中のThreadオブジェクトのinterrupt()を呼び出すことで、外部のThread
からそのThreadを起こすためですよね.
(表現が悪い?割り込みをかけるんですよね)
>JDK のリファレンスには Thread#interrupt() によって中断されたときに
>投げられるとあるだけです。そこで簡単なプログラムを書いて
>実験してみましたが、interrupt() を呼び出しても必ずしも中断する
>わけではなく、いまいち用途が分かりません。
もしかしたら、try{sleep(??);}catch(InterruptedException e){}
を実行しているThreadオブジェクトのinterrupt();を呼んでいないのでは?
大分前なんですがinterrupt();で正常にInterruptedExceptionが
発生したのを確認した記憶があります.
>さらによく分からないのが、Thread#interrupted() で、
>これはカレントスレッドが中断されているかどうか調べる
>(Tests if the current thread has been interrupted.)とありますが、
>中断されているスレッドからどうやって呼び出すのでしょう??
>あるいは、has been を「させられたことがある」と訳すのかな?
想像ですが(すみません仕様書よく呼んでません)、
「中断」ではなくそのThreadオブジェクトに対して
(過去に)interrupt();が呼び出されたかどうかを調べるためだと思います.
sleep()中だったらInterruptedExceptionを投げますが、interrupt()しようとした
(呼び出された側の)Threadが実行中の場合は例外が投げられないので、
割り込まれる側のThreadで独自に割り込みがあったかを調べなければな
らないのでisInterrupted()が用意されたんだと思います.
Interrupt()メソッドと、(割り込まれた側の)InterruptedExceptionと
isInterrupted()
によって外部からThreadを安全に終了させる(stop()を使わずに)手段ができたと
思っているのですが、いまだにInputStream#read()やServerSocket#accept()
を外部からやめさせる方法が分かっていません.
(これは個人的な話ですが)
-----------------------------------------------
shin@xxxxxxxxxx
-----------------------------------------------