Javaのお勉強その11
- スレッドその2
waitメソッドはスレッドのロックを解放し、通知を受けるまでスレッドを待機状態にする。
notifyメソッドはロックの解放を通知し、待機状態のスレッドのどれかをロック探索状態(ロック取得を求める状態)にする。
notifyAllメソッドはすべての待機中のスレッドに通知し、それらをロック探索状態にする。スレッドが多くなるとメソッドの実行時間は大きくなる。
wait、notify、notifyAllはObjectクラスに属するメソッドである。
interruptはThreadのメソッドである。そのスレッドがwaitで待機している場合は、それを再開してwaitにInterruptedExceptionをスローさせる。
holdsLockはObjectを引数に取るThreadのstaticメソッドである。Thread.holdsLock(obj)として、objはロックを取得されていればTrue、そうでなければFalseを返す。
2スレッドが互いに必要としているオブジェクトをロックするとプログラムが停止する。このことをデッドロックという。
staticなsynchronizedメソッドはクラスのロックを取得する。
synchronizedはメソッド全体でも、一部だけにつけることもできる。
- クラス1
クラスの中で定義されるクラスをネストクラスとよび、staticでないネストクラスをインナークラスという。staticでないネストクラスはstaticなメンバや静的初期化子を持つことができない。
staticでないネストクラスはその側のクラスのオブジェクトを生成してからでないと使えない。
class Outer{ class Inner1{ ... } static class Inner2{ ... } }
上のようなコードがあったときに、Outerの非staticなメソッドの内部では次のようにする。
Inner1 inner1 = new Inner1();
staticなメソッド内では次のようになる。
Outer outer = new Outer(); Inner1 inner1 = outer.new Inner1();
staticなネストクラスの場合はOuterのメソッド内では、
Inner2 inner2 = new Inner2();
になる。Outerの外部では次のように呼べる。
Outer.Inner1 inner1 = new Outer.new Inner1(); Outer.Inner2 inner2 = new Outer.Inner2();
メソッドの中でクラスを定義することもできる。ローカルインナークラスと呼ばれ、メソッド内でのみ有効になる。アクセス修飾子は付けられない。
インナークラスが定義されているメソッド内の変数や引数で、final指定されているものにはローカルインナークラスからアクセスできる。
0 件のコメント:
コメントを投稿