Javaスレッドが休眠します動力ノードJava学院の整理


sleep()紹介
sleep()は、Thread.javaに定義されている。
sleep()の役割は、現在のスレッドを休止させることであり、現在のスレッドは「運転状態」から「休止(ブロッキング)状態」に遷移することである。sleep()はスリープ時間を指定します。スレッドの休止時間はスリープ時間より大きいです。スレッドが再起動されると、「ブロック状態」から「準備状態」になり、cpuのスケジュール実行を待つことになります。 
sleep()例
sleep()の使い方を簡単な例で説明します。 

 // SleepTest.java   
 class ThreadA extends Thread{
   public ThreadA(String name){ 
     super(name); 
   } 
   public synchronized void run() { 
     try {
       for(int i=0; i <10; i++){ 
         System.out.printf("%s: %d
", this.getName(), i); // i 4 , 100 if (i%4 == 0) Thread.sleep(); } } catch (InterruptedException e) { e.printStackTrace(); } } } public class SleepTest{ public static void main(String[] args){ ThreadA t1 = new ThreadA("t1"); t.start(); } }
実行結果: 
t 1:0
t 1:1
t 1:2
t 1:3
t 1:4
t 1:5
t 1:6
t 1:7
t 1:8
t 1:9
結果説明:
プログラムは比較的簡単で、メインスレッドmainでスレッドt 1を起動します。t 1が起動した後、t 1の計算iが4で割り切れると、t 1は、Thread.sleep(100)を介して100ミリ秒スリープする。 
sleep()とwait()の比較
wait()の役割は、現在のスレッドを「運転状態」から「待ち(ブロック)状態」にすると同時に、同期ロックが解除されることを知っています。sleep()の役割は、現在のスレッドを「運転状態」から「休止(ブロッキング)状態」にすることです。
ただし、wait()は対象の同期ロックを解除しますが、sleep()はロックを解除しません。
以下では例示的にsleep()がロックを解除しないことを示している。 

 // SleepLockTest.java   
 public class SleepLockTest{ 
   private static Object obj = new Object();
   public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
     ThreadA t2 = new ThreadA("t2"); 
     t1.start(); 
    t2.start();
   } 
   static class ThreadA extends Thread{
     public ThreadA(String name){ 
       super(name); 
     } 
     public void run(){ 
       //   obj      
       synchronized (obj) {
         try {
          for(int i=0; i <10; i++){ 
             System.out.printf("%s: %d
", this.getName(), i); // i 4 , 100 if (i%4 == 0) Thread.sleep(100); } } catch (InterruptedException e) { e.printStackTrace(); } } } } }
実行結果:
t 1:0
t 1:1
t 1:2
t 1:3
t 1:4
t 1:5
t 1:6
t 1:7
t 1:8
t 1:9
t 2:0
t 2:1
t 2:2
t 2:3
t 2:4
t 2:5
t 2:6
t 2:7
t 2:8
t 2:9
結果説明:
メインスレッドmainでは、2つのスレッドt 1とt 2が起動されている。t 1とt 2は、同じオブジェクトの同期ロック、すなわち、synchronized(obj)を、run()に引用する。t 1の運転中、Thread.sleep(100)を呼び出すが、ただし、t 2はcpu実行権を取得しない。なぜなら、t 1は「Objが持つ同期ロック」を解放していないからである。
なお、私たちがsynchronized(obj)を注釈して再度実行すれば、t 1とt 2は互いに切り換えることができる。以下はコメント調のsynchronizedのソースコードです。 

// SleepLockTest.java   (   synchronized(obj))
 public class SleepLockTest{ 
   private static Object obj = new Object();
   public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
    ThreadA t2 = new ThreadA("t2"); 
     t.start(); 
     t.start();
   } 
   static class ThreadA extends Thread{
     public ThreadA(String name){ 
       super(name); 
     } 
     public void run(){ 
       //   obj      
 //      synchronized (obj) {
         try {
          for(int i=0; i <10; i++){ 
             System.out.printf("%s: %d
", this.getName(), i); // i 4 , 100 if (i%4 == 0) Thread.sleep(100); } } catch (InterruptedException e) { e.printStackTrace(); } // } } } }
以上は小编で绍介したJavaスレッドの休止です。動力ノードJava学院は整理して、みんなに助けがあることを望んで、もしみんなはいかなる疑問があるならば、メッセージを下さい。ここでも私たちのサイトを応援してくれてありがとうございます。