序文
この記事を読む前にあなたは、[Javaのメモリモデルと揮発性、同期化](見てすることをお勧めしますwww.jianshu.com/p/ad43ac258 ...各オブジェクトの実装のためのJava仮想マシンに導入されたモニターのロック)。
待つ
- 方法は、(すなわち、スレッドを覚ます)ロックを再取得しようとするスレッドを作るために呼び出しが通知されるまでブロックするために、現在のスレッドを待つかのnotifyAllメソッドを呼び出すことができます。
- メソッドを待って行うwaitメソッドを呼び出す方法を、次に、メソッドを呼び出す前に、監視対象のロックによって達成されるローカルメソッド、オブジェクトのモニターロック待ちでのみですか?
- これは、待ち時間が同期変更されたコードで実行しなければならない理由であるsynchronizedキーワードを追加することによって達成されます。しかし限り、待機メソッド呼び出しなど、モニターのロックがすぐに解放されます。
知らせます
そして、同じことが現在のオブジェクトの呼び出しで、またキーワードの変更を同期しているコードで呼び出すことができなければなりません。同様待ちます。
睡眠
- この方法は、睡眠のスレッドの使用が中断されますが、また、synchronizedキーワードが必要ですが、単にCPU時間のスライスを出してみましょう、とモニターオフロックを解除しませんでした。
- スレッドは、現在の実行スレッドがまだ完了していない場合、入力するために睡眠を呼び出して、スレッド同期方法の後ろに実行することは不可能です。
- ときに別の待機方法、それはモニターオフロックの解除直後に呼び出しますので、他のスレッドが現在のオブジェクトを呼び出して、ロックを取得することができますので。あなたはwaitメソッドを呼び出すと、スレッドが目を覚ます前に、それが(:これは、それがすぐにロックを取得することができると言うことではないロックを取得した後に実行されることに注意してください)競技ロックに参加し続けることです。
産出
- スレッドが実行されると、それは最高の優先度を持っています。
- 収率は唯一の提案で、スレッドを切り替えることが強制されないので、歩留まりのメソッドを呼び出すとき、JVMはおそらく偶然、他のスレッドが同じ優先度を持つ実行するようになり、それが行われない場合があります。
- スレッドを切り替えるとき、現在の利回りは、スレッドが、むしろ待っているかの状態を遮断するよりも、状態を実行するように呼びかけています。
加わります
プロセスが現在実行され、呼び出し元のスレッドがメソッドに参加しブロックする、完成した後、現在のスレッドを覚ます行きます。
追加:なぜ、ThreadクラスにObjectクラスのメソッド、睡眠を待つのか?
犯されている両方の行為は、本質的に異なるものです。
- 睡眠は()いくつかの時間のために中断されたスレッドが、その制御は、現在のスレッドによって決定されるようにすることです、それは内部のスレッドで決定、と言うことです。
- 待ち時間は、()を呼び出すオブジェクトによって定義されます
- 両方のスレッドがいくつかの時間を一時停止することを可能にするが、本質的に異なるが、状態制御を実行中のスレッドで、スレッド間の通信の問題です
睡眠と待機との違いは以下のとおりです。
- これらの2つの方法は、異なるクラスのオブジェクトやスレッドからです
- 他のスレッドが使用されるか、または同期制御ブロックの方法することができるように、この方法では、最も重要なスリープ解除ロック、ロック解除待ち方法ではありません。
- 待って、通知、およびのnotifyAllのみ同期または制御ブロック内で使用するための同期制御方法、及びどこでも睡眠を使用することができます
synchronized(x){
x.notify()
//或者wait()
}
复制代码
- 睡眠は、例外をキャッチして、待って、通知とのnotifyAllは、例外をキャッチする必要はありません必要があります