睡眠の最初に、役割
Thread.javaで定義された睡眠()。
睡眠()の役割は、現在のスレッドがスリープ状態にできるようにすることです現在のスレッドが「実行状態」から入ります、つまり、「スリープ(ブロック)ステートにします。」睡眠は()睡眠時間を指定し、スリープ時間スレッドはスリープ時間に等しい/よりも大きくすることができる。再スレッドウェイクアップし、CPUが実行をスケジュールするのを待っているように、それは、「ブロック」に「準備完了」となります。
、比較睡眠()と待つ()の
役割待ち()は、「待機(ブロック)状態」に現在のスレッド「実行状態」を可能にすることです、それはまた、同期ロックを解除します。睡眠の役割は、()もに「状態を実行している」現在のスレッドで聞かせている「スリープ(ブロック)ステートにします。」
しかし、待機()は、同期ロックオブジェクトを解放する、および(睡眠)ロックを解除しません。
// SleepLockTest.java的源码 パブリック クラスSleepLockTest { プライベート 静的オブジェクトOBJ = 新しいオブジェクト(); パブリック 静的 ボイドメイン(文字列[]引数){ スレッドAのT1 = 新しいスレッドA(「T1」)。 スレッドAのT2 = 新しいスレッドA( "T2" )。 t1.start(); t2.start(); } 静的 クラススレッドAが延びスレッド{ 公共スレッドA(文字列名){ スーパー(名); } 公共 無効RUN(){ // オブジェクトobjの同期がロックを取得 同期(OBJ){ 試みを{ のために(int型 I = 0;私は10 <;私は++ ){ System.out.printfを( "%のS:%D \ N-" 、この.getName()、I); // 私は4、スリープ100ミリ秒で割り切れることができる IF(I%4 == 0 ) のThread.sleep(百); } } キャッチ(InterruptedExceptionあるE){ e.printStackTrace( ); } } } } }
メインスレッド開始、二つの主要なスレッドT1およびT2。ラン()におけるT1及びT2は同じオブジェクトの同期ロック、即ち(OBJ)同期を参照します。それはのThread.sleep(100)を呼び出しますが、動作中のT1は、;しかし、t2は、CPUの実行権を取得するつもりはありません。そのため、t1は「objはゲンロックを開催し、」解放しません!
、我々はコメントしている場合、プログラムが再び実行される(OBJ)同期、T1、T2は互いに切り替えることができます