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

服務器之家:專注于服務器技術(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)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 女暴露狂校园裸露小说 | 国产91精品区 | 湿好紧太硬了我太爽了 | 四虎成人国产精品视频 | 无码国产成人777爽死 | 四川女人偷人真实视频 | 极品美女写真菠萝蜜视频 | 韩国禁片在线观看久 | 欧美日韩国产成人综合在线影院 | 国产午夜精品一区二区三区不卡 | 久久精品视频91 | 久久久GOGO无码啪啪艺术 | 亚洲成人福利网站 | 国产videos hd | 国产一级免费片 | 亚洲精品有码在线观看 | 国产精品国语自产拍在线观看 | 窝窝午夜理伦影院 | tube日本高清老少配 | 国产美女做爰免费视频软件 | 国产免费久久精品44 | 国产精品乱码高清在线观看 | 爱爱小说漫画 | 特级非洲黑人一级毛片 | 丝袜足控免费网站xx动漫漫画 | 亚洲第一二三四区 | 99国产牛牛视频在线网站 | 欧美另类xxx精品人妖 | 欧美日韩一级视频 | 青草视频免费观看在线观看 | 国产福利视频一区二区微拍视频 | 美女扒开两腿露出尿口的视频 | 国产亚洲精品美女久久久 | 久久中文字幕无线观看 | 免费成年人在线视频 | 韩日一区二区三区 | 超h 超重口 高h 污肉1v1 | 欧美精品1区2区 | 羞羞视频麻豆 | 久久丫线这里只精品 | 日本人做受全过程视频 |