最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java線程讓步_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年05月25日 09:48:31   投稿:mrr  
yield()的作用是讓步。它能讓當(dāng)前線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級(jí)的等待線程獲取執(zhí)行權(quán)。下面通過(guò)本文給大家介紹Java線程讓步的相關(guān)知識(shí),需要的朋友參考下吧

yield()介紹

yield()的作用是讓步。它能讓當(dāng)前線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級(jí)的等待線程獲取執(zhí)行權(quán);但是,并不能保證在當(dāng)前線程調(diào)用yield()之后,其它具有相同優(yōu)先級(jí)的線程就一定能獲得執(zhí)行權(quán);也有可能是當(dāng)前線程又進(jìn)入到“運(yùn)行狀態(tài)”繼續(xù)運(yùn)行! 

yield()示例

下面,通過(guò)示例查看它的用法。 

// 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\n", this.getName(), this.getPriority(), i); 
       // i整除4時(shí),調(diào)用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();
   } 
 } 

(某一次的)運(yùn)行結(jié)果: 

t1 [5]:0
t2 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9 

結(jié)果說(shuō)明:

“線程t1”在能被4整數(shù)的時(shí)候,并沒(méi)有切換到“線程t2”。這表明,yield()雖然可以讓線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”;但是,它不一定會(huì)讓其它線程獲取CPU執(zhí)行權(quán)(即,其它線程進(jìn)入到“運(yùn)行狀態(tài)”),即使這個(gè)“其它線程”與當(dāng)前調(diào)用yield()的線程具有相同的優(yōu)先級(jí)。 

yield() 與 wait()的比較

我們知道,wait()的作用是讓當(dāng)前線程由“運(yùn)行狀態(tài)”進(jìn)入“等待(阻塞)狀態(tài)”的同時(shí),也會(huì)釋放同步鎖。而yield()的作用是讓步,它也會(huì)讓當(dāng)前線程離開“運(yùn)行狀態(tài)”。它們的區(qū)別是:

(01) wait()是讓線程由“運(yùn)行狀態(tài)”進(jìn)入到“等待(阻塞)狀態(tài)”,而不yield()是讓線程由“運(yùn)行狀態(tài)”進(jìn)入到“就緒狀態(tài)”。

(02) wait()是會(huì)線程釋放它所持有對(duì)象的同步鎖,而yield()方法不會(huì)釋放鎖。

下面通過(guò)示例演示yield()是不會(huì)釋放鎖的。 

// 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對(duì)象的同步鎖
       synchronized (obj) {
         for(int i=0; i <10; i++){ 
           System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i); 
           // i整除時(shí),調(diào)用yield
          if (i%4 == 0)
             Thread.yield();
         }
       }
     } 
   } 
 } 
  

(某一次)運(yùn)行結(jié)果: 

t1 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:0
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9 

結(jié)果說(shuō)明:

主線程main中啟動(dòng)了兩個(gè)線程t1和t2。t1和t2在run()會(huì)引用同一個(gè)對(duì)象的同步鎖,即synchronized(obj)。在t1運(yùn)行過(guò)程中,雖然它會(huì)調(diào)用Thread.yield();但是,t2是不會(huì)獲取cpu執(zhí)行權(quán)的。因?yàn)椋瑃1并沒(méi)有釋放“obj所持有的同步鎖”

以上所述是小編給大家介紹的Java線程讓步_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評(píng)論

岑巩县| 景泰县| 苍溪县| 辽阳县| 西乌珠穆沁旗| 巴林右旗| 安顺市| 彰化市| 昭平县| 东莞市| 无棣县| 新源县| 姜堰市| 吉隆县| 吉林市| 安阳市| 府谷县| 延安市| 舟山市| 合江县| 丹棱县| 溆浦县| 正镶白旗| 洛宁县| 延安市| 舟山市| 清水河县| 寻乌县| 乐东| 双城市| 临夏县| 绥芬河市| 颍上县| 应城市| 奉节县| 郓城县| 高安市| 陈巴尔虎旗| 叙永县| 定西市| 黄山市|