[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
-----------------------------------------------