Javaスレッド譲歩動力ノードJava学院の整理


yield()の紹介
yieldの役割は譲歩です。現在のスレッドを「実行状態」から「準備完了状態」にすることができ、他のスレッドが同じ優先度で実行権を取得することができます。ただし、現在のスレッドがyield()を呼び出した後に、他の同じ優先順位のスレッドが必ず実行権を得ることは保証できない。現在のスレッドが「運転状態」に入っている可能性もあります。 
yield()の例
以下では、例を通してその用法を調べます。 

// YieldTest.java   
 class ThreadA extends Thread{
   public ThreadA(String name){ 
     super(name); 
   } 
   public synchronized void run(){ 
     for(int i=0; i <10; i++){ 
       System.out.printf("%s [%d]:%d
", this.getName(), this.getPriority(), i); // i 4 , yield if (i%4 == 0) Thread.yield(); } } } public class YieldTest{ public static void main(String[] args){ ThreadA t1 = new ThreadA("t1"); ThreadA t2 = new ThreadA("t2"); t1.start(); t2.start(); } }
(一回の)運転結果: 
t 1[5]:0
t 2[5]:0
t 1[5]:1
t 1[5]:2
t 1[5]:3
t 1[5]:4
t 1[5]:5
t 1[5]:6
t 1[5]:7
t 1[5]:8
t 1[5]:9
t 2[5]:1
t 2[5]:2
t 2[5]:3
t 2[5]:4
t 2[5]:5
t 2[5]:6
t 2[5]:7
t 2[5]:8
t 2[5]:9 
結果説明:
「スレッドt 1」は、4整数が可能な場合、「スレッドt 2」に切り替えられていない。これは、yield()がスレッドを「運転状態」から「準備完了状態」にすることができるが、しかし、必ずしも他のスレッドにCPU実行権(つまり、他のスレッドを「実行状態」にする)を取得させるとは限らず、この「他のスレッド」が現在のyield()を呼び出すスレッドと同じ優先度を持っているとしても。 
yield()とwait()の比較
wait()の役割は、現在のスレッドを「運転状態」から「待ち(ブロック)状態」にすると同時に、同期ロックが解除されることを知っています。一方、yield()の役割は譲歩であり、現在のスレッドを「実行状態」から外すこともある。その違いは:
(01)wait()はスレッドを「運転状態」から「待ち(ブロック)状態」にし、yield()ではなく「運転状態」から「準備状態」にします。
(02)wait()は、持っているオブジェクトの同期ロックをスレッドでリリースしますが、yield()はロックを解除しません。
以下では、一例としてyield()がロックを解除しないことを示します。 

// YieldLockTest.java    
 public class YieldLockTest{ 
   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) {
         for(int i=0; i <10; i++){ 
           System.out.printf("%s [%d]:%d
", this.getName(), this.getPriority(), i); // i , yield if (i%4 == 0) Thread.yield(); } } } } }
  
(ある時)運転結果: 
t 1[5]:0
t 1[5]:1
t 1[5]:2
t 1[5]:3
t 1[5]:4
t 1[5]:5
t 1[5]:6
t 1[5]:7
t 1[5]:8
t 1[5]:9
t 2[5]:0
t 2[5]:1
t 2[5]:2
t 2[5]:3
t 2[5]:4
t 2[5]:5
t 2[5]:6
t 2[5]:7
t 2[5]:8
t 2[5]:9 
結果説明:
メインスレッドmainでは、2つのスレッドt 1とt 2が起動されている。t 1とt 2は、同じオブジェクトの同期ロック、すなわち、synchronized(obj)を、run()に引用する。t 1の運転中、Thread.yield()を呼び出しますが、ただし、t 2はcpu実行権を取得しない。t 1は、「Objが持つ同期ロック」を解放していないからである。
以上、小编でご绍介したJavaスレッドの譲歩です。動力ノードJava学院は整理して、みんなに助けがあることを望んで、もしみんなはいかなる疑問があるならば、メッセージを下さい。ここでも私たちのサイトを応援してくれてありがとうございます。