java多線程筆記之讓步yield例子

java多線程以前介紹過很多這類文章了,下面我看了月小升博客寫的一篇關于多線程讓步yield例子了,下面一聚教程小編就來給各位轉過來,希望例子對各位會帶一幫助。

先看個yield讓步的例子

代碼如下

package com.javaer.thread;

public class YThread implements Runnable {
private Object obj = new Object();

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
YThread s = new YThread();
Thread t1 = new Thread(s, "Thread1");
Thread t2 = new Thread(s, "Thread2");
t1.start();
t2.start();

}

@Override
public void run() {

for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {

}
System.out.println(Thread.currentThread().getName() + " 在運行 " + i);
if (Thread.currentThread().getName().equals("Thread1")) {
Thread.yield();
}
}

}

}
輸出

Thread1 在運行 0
Thread2 在運行 0
Thread1 在運行 1
Thread2 在運行 1
Thread2 在運行 2
Thread1 在運行 2
Thread2 在運行 3
Thread1 在運行 3
Thread2 在運行 4
Thread1 在運行 4
Thread2 在運行 5
Thread1 在運行 5
Thread2 在運行 6
Thread1 在運行 6
Thread2 在運行 7
Thread1 在運行 7
Thread2 在運行 8
Thread1 在運行 8
Thread2 在運行 9
Thread1 在運行 9

我們發現盡管從第一次循環就開始讓步了,不過系統在第二次循環才真正讓出資源。另外,如果多次執行這個代碼,發現有時候根本沒有讓出來。

結論

讓步會主動讓出系統資源給其他線程,但是不代表讓步了,其他線程就能獲得CPU資源。另外讓步不影響自己線程繼續執行。類似兩個車子在路上開,給別人讓路不代表我要停下。

看下讓步與鎖的相互作用

代碼如下
package com.javaer.thread;

public class YThread implements Runnable{
private Object obj = new Object();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
YThread s= new YThread();
Thread t1 = new Thread(s, "Thread1");
Thread t2 = new Thread(s, "Thread2");
t1.start();
t2.start();

}

@Override
public void run() {

synchronized(obj){
for(int i =0 ; i < 10;i++){
try {
Thread.sleep(10);
} catch (InterruptedException e) {

}
System.out.println(Thread.currentThread().getName() + " 在運行 " + i);
if(Thread.currentThread().getName().equals("Thread1")){
Thread.yield();
}
}
}
}

}

我們知道,wait()的作用是讓當前線程由“運行狀態”進入“等待(阻塞)狀態”的同時,也會釋放同步鎖。而yield()的作用是讓步,它也會讓當前線程離開“運行狀態”。它們的區別是:
(01) wait()是讓線程由“運行狀態”進入到“等待(阻塞)狀態”,而不yield()是讓線程由“運行狀態”進入到“就緒狀態”。
(02) wait()是會線程釋放它所持有對象的同步鎖,而yield()方法不會釋放鎖。

上面的結果看出,程序整個被鎖定,進行了順序執行

Thread1 在運行 0
Thread1 在運行 1
Thread1 在運行 2
Thread1 在運行 3
Thread1 在運行 4
Thread1 在運行 5
Thread1 在運行 6
Thread1 在運行 7
Thread1 在運行 8
Thread1 在運行 9
Thread2 在運行 0
Thread2 在運行 1
Thread2 在運行 2
Thread2 在運行 3
Thread2 在運行 4
Thread2 在運行 5
Thread2 在運行 6
Thread2 在運行 7
Thread2 在運行 8
Thread2 在運行 9
總結
yield()的作用是讓步。它能讓當前線程由“運行狀態”進入到“就緒狀態”,從而讓其它具有相同優先級的等待線程獲取執行權;但是,並不能保證在當前線程調用yield()之後,其它具有相同優先級的線程就一定能獲得執行權;也有可能是當前線程又進入到“運行狀態”繼續運行!

1.僅僅是讓步
2.不會釋放鎖

更多相關文章
  • 文章來給各位介紹一下Java多線程中的wait與notify,notifyall例子,希望文章能給各位朋友帶來幫助哦.在Java多線程編程中,wait()的作用的是讓當前線程進入阻塞狀態,notify()是讓當前線程喚醒繼續執行.雖然是對線程狀態的控制,但它們其實都是Object中的方法,這是因爲w
  • Java語言支持多線程,本文我們來詳細探討一下Java多線程原理,後面講了Java多線程應用 ThreadLocal多線程實例.一.線程和進程的概念現在的操作系統是多任務操作系統.多線程是實現多任務的一種方式.進程是程序的一個動態執行過程,是指一個記憶體中運行的應用程序,每個進程都有自己獨立的一塊記
  • 本文章分享一篇關于Java多線程notify&notifyall的區別 ,有需要的朋友可以參考一下下.當一個線程進入wait之後,就必須等其他線程notify/notifyall,使用notifyall,可以喚醒所有
  • OneNote線上筆記服務利用郵箱保存記錄教程
    Office OneNote是一種數字筆記本,它能爲用戶提供收集筆記和信息的線上存儲服務.也可以通過郵件發送筆記能容進行記錄.具體操作方法接下來小編爲 大家整理分享. 1.訪問OneNote郵箱賬戶設置頁面:http://www.onenote.com/emailsettings/,用戶需要登錄自己 ...
  • 很多同學對 java web 專案中多線程的應用場景會搞不清楚,本文章我們來簡單描述一下在 java web 開發中需要用到多線程編程的場景.問:能不能簡單描述一下你在java web開發中需要用到多線程編程的場景?
  • 線程的join合並的含義就是將幾個並行線程的線程合並爲一個單線程執行,應用場景是當一個線程必須等待另一個線程執行完畢才能執行時可以使用join方法.線程的join合並的含義就是將幾個並行線程的線程合並爲一個單線程執行
  • 一.java開發環境的安裝與配置 1.下載JDK. 2.安裝JDK.注意在安裝時安裝路徑中不要有空格,例如安裝路徑爲:D:Javajdk1.6.0_30. 3.設置環境變量.可以是用戶變量,也可以是系統變量.主要設置
  • 許多Java程序員在面試前才會去看面試題,因爲收集面試題和練習很花時間,所以我從許多面試者那裏收集了Java多線程和並發相關的70個熱門問題.下面是Java線程相關的熱門面試題,你可以用它來好好准備面試.1) 什麽是線程?線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運 ...
一周排行