一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java線程讓步_動力節(jié)點Java學院整理

Java線程讓步_動力節(jié)點Java學院整理

2020-10-28 15:10動力節(jié)點 Java教程

yield()的作用是讓步。它能讓當前線程由“運行狀態(tài)”進入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級的等待線程獲取執(zhí)行權(quán)。下面通過本文給大家介紹Java線程讓步的相關(guān)知識,需要的朋友參考下吧

yield()介紹

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

yield()示例

下面,通過示例查看它的用法。 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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時,調(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();
   }
 }

(某一次的)運行結(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é)果說明:

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

yield() 與 wait()的比較

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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\n", this.getName(), this.getPriority(), i);
           // i整除時,調(diào)用yield
          if (i%4 == 0)
             Thread.yield();
         }
       }
     }
   }
 }
  

(某一次)運行結(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é)果說明:

主線程main中啟動了兩個線程t1和t2。t1和t2在run()會引用同一個對象的同步鎖,即synchronized(obj)。在t1運行過程中,雖然它會調(diào)用Thread.yield();但是,t2是不會獲取cpu執(zhí)行權(quán)的。因為,t1并沒有釋放“obj所持有的同步鎖”

以上所述是小編給大家介紹的Java線程讓步_動力節(jié)點Java學院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網(wǎng)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2021国产精品露脸在线 | 欧美不卡一区二区三区 | chinesegay黑袜玩奴 | 美女的让男人桶爽30分钟的 | 久久综合给合久久狠狠狠… | 好大好硬好紧太深了受不了 | 99久久精品免费看国产四区 | 日本在线亚州精品视频在线 | 99视频在线观看视频一区 | 贰佰麻豆剧果冻传媒一二三区 | 亚州笫一色惰网站 | 国产在线精品99一卡2卡 | 男人最爱看的网站 | 亚洲精品一二区 | 亚洲国产成人综合 | 四虎在线观看 | 欧美同志网址 | 日本一在线中文字幕天堂 | 公交车揉捏大乳呻吟喘娇 | 激情五月姐姐 | 男人午夜免费视频 | 国产精视频 | 古代翁熄系小说辣文 | 乌克兰粉嫩摘花第一次 | 亚洲www美色 | 高清在线观看免费入口 | 99精品国产高清自在线看超 | 日本人护士免费xxxx视频 | 97青草 | 欧洲女同同性videos0 | 欧美综合影院 | 亚洲欧洲淘宝天堂日本 | 日韩一区二区三区四区区区 | 暖暖的免费观看高清视频韩国 | 精东影业传媒全部作品 | 国产精品调教 | poren18日本老师hd | 4虎影院在线观看 | 911爱豆传媒国产 | 好姑娘在线观看完整版免费 | 雪恋电影完整版免费观看 |