Object waitメソッド
1512 ワード
概要
スレッドBが共有リソースにアクセスすると、リソースのロックオブジェクトを取得しようとすると、このロックがスレッドAによって取得されたことに気づき、このとき、スレッドBは一時停止され、スレッドAがロックを解除するのを待つしかない.
しかし、ロックを取得したスレッドAは、実行中、いくつかの条件が満たされていないため、しばらく実行を続けたくないので、先に待ちたい(注意:ロックを取得したスレッドA自身が自発的に待ちたい)と思って、ある条件が満たされてから、引き続きタスクを実行したいと思っています.同期コードブロックでは、スレッドAがロックを解除してから、スレッドBがロックを取得し、同期コードブロックに入り、コードを実行する資格があります.スレッドBの実行が完了すると、スレッドAに必要な条件が満たされると、このとき、スレッドAが待機状態から実行状態になり、コードの実行を継続する通知メカニズムが必要となる.
スレッドAも常にループして判断し、条件が満たされているかどうかをチェックし、必ずしも自分を中断して待つ必要はないと考えている学生もいます.実はこれも一つの考えですが、しかし?CPUを比較的消費し、条件がいつ満たされるか分からない.
スレッド間でコミュニケーションを調整するには、
Objectのwaitメソッド
スレッドAを待機状態にするには、現在のオブジェクト
注意:
スレッドBが共有リソースにアクセスすると、リソースのロックオブジェクトを取得しようとすると、このロックがスレッドAによって取得されたことに気づき、このとき、スレッドBは一時停止され、スレッドAがロックを解除するのを待つしかない.
しかし、ロックを取得したスレッドAは、実行中、いくつかの条件が満たされていないため、しばらく実行を続けたくないので、先に待ちたい(注意:ロックを取得したスレッドA自身が自発的に待ちたい)と思って、ある条件が満たされてから、引き続きタスクを実行したいと思っています.同期コードブロックでは、スレッドAがロックを解除してから、スレッドBがロックを取得し、同期コードブロックに入り、コードを実行する資格があります.スレッドBの実行が完了すると、スレッドAに必要な条件が満たされると、このとき、スレッドAが待機状態から実行状態になり、コードの実行を継続する通知メカニズムが必要となる.
スレッドAも常にループして判断し、条件が満たされているかどうかをチェックし、必ずしも自分を中断して待つ必要はないと考えている学生もいます.実はこれも一つの考えですが、しかし?CPUを比較的消費し、条件がいつ満たされるか分からない.
スレッド間でコミュニケーションを調整するには、
JAVA
の中にwait
メソッドとnotify
メソッドが対応する待機メカニズムと通知メカニズムが必要です.Objectのwaitメソッド
synchronized (obj) {
while (condition does not ok){
obj.wait();
}
}
スレッドAを待機状態にするには、現在のオブジェクト
wait
メソッドを呼び出すことができる.waitメソッドが呼び出されると、スレッドAがロックされ、できることがすべて行われたことを意味します.今は待つしかありません.別の同期操作がコードを実行するのを待ってから、私は帰って仕事を続けます.注意:
wait
メソッドはルートクラスObject
に定義され、ThreadはObject
クラスから継承され、wait
メソッドも自然に存在する.しかし、ここでは、現在のスレッドオブジェクトを呼び出すwait
メソッドではなく、ロック属性を有する現在のオブジェクトのwait
メソッドである.この点は私にもよくわかりませんが、スレッドAが待機状態に切り替わるようにして、その後起こされるようにするには、スレッドAのwait
メソッドとnotify
メソッドを使っても実際にはできると思いますが、実現するのは面倒だと思います.また,シーン的にはwait
定義がObject
であっても合理的であり,スレッドがオブジェクトの待機プールに掛けられていることを示す.