Object waitメソッド


概要
スレッド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であっても合理的であり,スレッドがオブジェクトの待機プールに掛けられていることを示す.