枭龙801

博客园 首页 新随笔 联系 订阅 管理

版权声明:本文为"stone"原创文章,转载请注明出处 —— http://blog.csdn.net/jjwwmlp456。QQ交流群:473876194

yield:

解释它之前,先简述下,多线程的执行流程:多个线程并发请求执行时,由cpu决定优先执行哪一个,

即使通过thread.setPriority(),设置了线程的优先级,也不一定就是每次都先执行它

    yield,表示暂停当前线程,执行其他线程(包括自身线程) 由cpu决定

 

[java] view plain copy
 
 print?
  1. public class TestYield implements Runnable {    
  2.         
  3.         public void run() {    
  4.   
  5.                 System.out.println("first: " + Thread.currentThread().getName() );    
  6.                 // 暂停当前正在执行的线程对象,并执行其他线程,就是进入就绪状态    
  7.                 Thread.currentThread().yield();    
  8.                 // 可能还会执行 本线程: 以下语句不一定紧接着上面的语句被执行,可能其他线程的先执行了  
  9.                 System.out.println("second: " + Thread.currentThread().getName() );    
  10.   
  11.         }    
  12.         
  13.         public static void main(String[] args) {    
  14.             TestYield runn = new TestYield();    
  15.             Thread t1 = new Thread(runn);    
  16.             Thread t2 = new Thread(runn);    
  17.             Thread t3 = new Thread(runn);    
  18.                 
  19.             t2.setPriority(t2.getPriority()+1); //设置t2的线程优先级   
  20.             t1.start();    
  21.             t2.start();    
  22.             t3.start();    
  23.         
  24.         }    
  25. }    


多次运行,看运行结果

 

某一次:

 

[java] view plain copy
 
 print?
  1. first: Thread-0  
  2. first: Thread-2  
  3. second: Thread-2  
  4. first: Thread-1  
  5. second: Thread-0  
  6. second: Thread-1  

再一次:

 

 

[java] view plain copy
 
 print?
  1. first: Thread-1  
  2. first: Thread-2  
  3. first: Thread-0  
  4. second: Thread-2  
  5. second: Thread-1  
  6. second: Thread-0  


其实默认情况下,多线程时,cpu就会切换执行的任务线程,而yield方法,只是人为的通知系统,进行切换,

 

且有一定机率能切换回本身

 

 

join:

 

阻塞所在线程,等调用它的线程执行完毕,再向下执行

 

[java] view plain copy
 
 print?
  1. public class TestJoin {    
  2.         
  3.     public static void main(String[] args) throws InterruptedException {  
  4.   
  5.         final Thread thread1 = new Thread() {  
  6.             public void run() {  
  7.                 System.out.println("first");  
  8.                 try {  
  9.                     Thread.sleep(500);  
  10.                 } catch (InterruptedException e) {  
  11.                     e.printStackTrace();  
  12.                 }  
  13.                 System.out.println("second");  
  14.             };  
  15.         };  
  16.         thread1.start();  
  17. //      thread1.join();     //在这阻塞主线程main  
  18.           
  19.         Thread thread2 = new Thread() {  
  20.             public void run() {  
  21.                 try {  
  22.                     System.out.println("third");  
  23. //                  thread1.join(); // 等待t1线程 执行完结,才继续向下执行  在这阻塞子线程thread2  
  24.   
  25.                 } catch (Exception e) {  
  26.                     e.printStackTrace();  
  27.                 }  
  28.                 System.out.println("fourth");  
  29.             };  
  30.         };  
  31.         thread2.start();  
  32.     }  
  33. }    

 

> 当没有打开相关的join调用代码时,『third、fourth』应该会优先于『second』进行输出

> 当仅打开主线程中的join调用代码时,则会阻塞主线程,thread2要等待thread1执行完后再执行,则会输出:

 

[plain] view plain copy
 
 print?
  1. first  
  2. second  
  3. third  
  4. fourth  


> 当仅打开thread2中的join调用代码时,则会阻塞thread2,则会输出:

 

 

[plain] view plain copy
 
 print?
  1. first  
  2. third  
  3. second  
  4. fourth  

 

posted on 2017-07-24 16:15  枭龙801  阅读(187)  评论(0)    收藏  举报