1. 程式人生 > >Java執行緒sleep,yield,join,wait方法詳解

Java執行緒sleep,yield,join,wait方法詳解

1、sleep()

當一個執行緒呼叫sleep方法後,他就會放棄cpu,轉到阻塞佇列,sleep(long millis)方法是Thread類中的靜態方法,millis引數設定執行緒睡眠的時間,毫秒為單位。當呼叫sleep方法的時候,可以讓其他執行緒有機會執行,但是注意sleep方法不會釋放物件鎖,我們所說的鎖,一般情況下是同步鎖,也就是被synchronized修飾的方法或者同步塊,被synchronized關鍵字修飾的代表同步,如果大家想要訪問/執行這部分的資料/程式碼就要排隊等候。想要呼叫sleep方法讓別的執行緒訪問同步塊中的內容是不可能的,原因就sleep方法不會釋放鎖。

2、yield()

yield()方法中沒有引數。當執行緒執行Thread中的yield()靜態方法是時候,如果此時具有同等優先順序的其他執行緒就處於就緒狀態了。如果沒有同等優先順序的執行緒,那麼yield()方法什麼也不做。這個方法只給同等優先順序的執行緒機會,對於其他的執行緒不管,還是一個很公平的方法。

sleep()和yield()方法都是Thread中的靜態方法,都會讓當前處於執行狀態的執行緒放棄cpu,讓其他執行緒有執行的機會,但是也是有區別的:

  1. sleep()方法和yield()方法都會給其他執行緒執行的機會但是sleep()方法不會考慮執行緒的優先順序,因此會給優先順序低的執行緒機會,讓優先順序低的執行緒有機會執行。yield()方法只會給相同優先順序的執行緒或者更高優先順序的執行緒機會,對於低優先順序的不管。
  2. sleep()方法會宣告丟擲異常,需要捕獲處理,yield()不會宣告丟擲異常
  3. 當執行緒執行yield()方法的時候,執行緒轉到就緒狀態,當執行緒執行sleep()方法的時候,執行緒轉到阻塞狀態

3、join()

等待其他執行緒結束。當前執行的執行緒可以呼叫另一個執行緒的join()方法,當前執行緒就會轉到阻塞佇列,等到另一個執行緒執行結束,本執行緒才能恢復執行

4、wait()和notify()、notifyAll()

這三個方法是Object類中的方法,都會對鎖進行操作,所以都要在同步程式碼塊中使用,這樣才可以讓其他執行緒共享其中的資料。wait()方法使當前執行緒暫停執行並釋放物件鎖,讓其他執行緒可以進入synchronized資料塊,當前執行緒被放入物件等待池中。當呼叫notify()方法後,將從物件的等待池中有機會移走一個任意的執行緒並放到鎖標誌等待池中,只有鎖標誌等待池中執行緒能夠獲取鎖標誌;如果鎖標誌等待池中沒有執行緒,則notify()不起作用。notifyAll()則從物件等待池中移走所有等待那個物件的執行緒並放到鎖標誌等待池中。

相關推薦

Java執行sleepyieldjoinwait方法

1、sleep() 當一個執行緒呼叫sleep方法後,他就會放棄cpu,轉到阻塞佇列,sleep(long millis)方法是Thread類中的靜態方法,millis引數設定執行緒睡眠的時間,毫秒為

執行初步(五)---joinyield

今天我們來學習一下執行緒裡面的兩個方法 一、join(); join方法:等待執行緒終止。 使用方法 執行緒名.join(); 表示的是當前執行緒加入,當新加入的執行緒加入,原先的執行緒才會開始執行,接下來我們寫一個小程式來演示一

Java 執行sleep() 和 wait()的區別

sleep(休眠) 和 wait(等待) 方法是 Java 多執行緒中常用的兩個方法 區別1:使用限制 使用 sleep 方法可以讓當前執行緒休眠,時間一到當前執行緒繼續往下執行,在任何地方都能使用

Java執行狀態以及 sheep()、wait()、yield() 的區別

前言 最近看到很多人都在討論多執行緒的問題,於是寫出了這篇部落格,希望可以幫到正在學習和使用這塊的朋友們,首先我們先看看兩個圖(兩個圖都來自其他碼農的分享)。   這兩個圖是一樣的邏輯,這裡一起羅列出來,下面讓我們用語句來簡單描述下兩個圖: sleep 讓執行緒從 【run

執行sleepyield的區別

import java.util.Date; //執行緒暫停 public class SleepTest { public static void main(String[] args) th

執行--sleepyield對比

這篇小編想分享一下關於我們常見的sleep、yield方法的有什麼不同。 1、sleep:執行緒睡眠,如果我們需要讓當前正在執行的執行緒暫停一段時間,並進入阻塞狀態,就可以通過呼叫sleep方法來實現。線上程進入阻塞狀態後,再sleep 這段時間內,該執行緒不會獲得執行的機

我的android多執行程式設計之路(1)之經驗原始碼分析

寫在伊始 android開發這麼久了,對於多執行緒這塊一直處於似懂非懂的神奇狀態,今天總結出來,分享一下,希望大家多多指正。共同交流,懇望得到您的建議。 本文簡介 本文會基於自己在開發中對於執行緒這塊的實際使用,大概從執行緒程序的概念,執行緒的建立(T

java執行物件鎖、類鎖、同步機制

1.在java多執行緒程式設計中物件鎖、類鎖、同步機制synchronized詳解:     物件鎖:在java中每個物件都有一個唯一的鎖,物件鎖用於物件例項方法或者一個物件例項上面的。     類鎖:是用於一個類靜態方法或者class物件的,一個

Java執行間通訊的同步問題、wait/notify使用

Java執行緒間通訊簡單來說就是多個執行緒同時操作同一個資源,比如一個執行緒設定了姓名、性別,另一個執行緒讀取姓名、性別。 伴隨而來的就是同步問題:比如執行緒a先設定了張三、男,後設置了李四、女,執行緒b要列印這些資訊,由於多執行緒的隨機性,a設定張三、男後,然後a又設定了李四,還未設定性別時,

執行執行之間的協作(joinwait、notify、notifyAll、await、signal、signalAll)

當多個執行緒可以一起工作去解決某個問題時,如果某些部分必須在其它部分之前完成,那麼就需要對執行緒進行協調。 join() 線上程中呼叫另一個執行緒的 join() 方法,會將當前執行緒掛起,而不是忙等待,直到目標執行緒結束。 對於以下程式碼,雖然 b 執行緒先啟動,但是因為在 b 執

05-執行的狀態以及各狀態之間的轉換

執行緒被創建出來之後,它並不是會立刻執行,而是由多個執行緒進行搶佔CPU資源,那麼,哪一個執行緒搶佔到了,那一個執行緒就來執行。就像之前講的烤燒餅的例子一樣,爐子上面有多個任務在轉,轉到哪個任務(燒餅),那麼,那個任務就執行,也就是說,在這個過程中,涉及到執行緒的生命週期的問題,就是說,從執行緒的建

Java實現數組去除重復數據的方法

.com 但是 xhtml 一個數 addall dset tro pareto 內部類 一.用List集合實現 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList&l

Java工具類StringUtils中trim、trimToEmpty、trimToNull方法

1. trim方法原始碼詳解 public static String trim(String str) { return str == null ? null : str.trim(); }1234原始碼解析:輸入引數為null時返回nul

(十二)Java工具類StringUtils中trim、trimToEmpty、trimToNull方法

1. trim方法原始碼詳解 public static String trim(String str) { return str == null ? null : str.trim(); } 原始碼解析:輸入引數為n

執行sleepwaitjoinyield方法的區別

原文地址:http://dylanxu.iteye.com/blog/1322066 1、sleep() 使當前執行緒(即呼叫該方法的執行緒)暫停執行一段時間,讓其他執行緒有機會繼續執行,但它並不釋放物件鎖。也就是說如果有synchronized同步

java 執行 joinwait) 後是如何喚醒

Join 方法:本質上還是根據wait方法實現的。分析join原始碼發現join方法本身是使用了synchronized修飾符的。是加在方法上面的,意味著。 獲取了當前物件的鎖,然後繼續發現裡面的程式碼呼叫了wait。意味著我們先鎖,再釋放,等待喚醒,什麼情況下被喚醒呢:

java執行wait()notify()notifyAll()synchronized(obj){}join()

wait(),notify(),notifyAll(),synchronized wait()和notify()是java.lang.Object的物件方法,synchronized是java關鍵字;wait()和notify()必須配合synchronized

Java執行休眠方法sleep執行讓步yieldjoin方法

執行緒休眠(sleep方法) 執行緒休眠:讓執行緒暫緩執行,等到預計時間之後再恢復執行。 執行緒休眠會交出cpu,讓cpu去執行其他任務,但是不會釋放鎖。 比如:當前執行緒sleep休眠了,但是如果此執行緒在休眠前持有某個物件的鎖,那就算它休眠了其他執行緒也不能獲取到這個物件的鎖。

Java執行sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和區別

Java執行緒中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和區別從作業系統的角度講,os會維護一個ready queue(就緒的執行緒佇列)。並且在某一

Java執行joinyieldsleep方法

在Java多執行緒程式設計中,Thread類是其中一個核心和關鍵的角色。因此,對該類中一些基礎常用方法的理解和熟練使用是開發多執行緒程式碼的基礎。本篇主要總結一下Thread中常用的一些靜態方法的含義及程式碼中的使用。 sleep方法 原始碼如下: /** * Causes the curr