1. 程式人生 > >、sleep() wait() yeild()三者之間的區別?

、sleep() wait() yeild()三者之間的區別?

1、sleep()方法會給其他執行緒執行的機會,而不考慮其他執行緒的優先順序,因此會給較低執行緒一個執行的機會;yield()方法只會給相同優先順序或者更高優先順序的執行緒一個執行的機會。
 2、當執行緒執行了sleep(long millis)方法後,將轉到阻塞狀態,引數millis指定睡眠時間;當執行緒執行了yield()方法後,將轉到就緒狀態。
 3、sleep()方法宣告丟擲InterruptedException異常,而yield()方法沒有宣告丟擲任何異常
 4、sleep()方法比yield()方法具有更好的移植性
 5、當執行緒呼叫了自身的sleep()方法或其他執行緒的join()方法,就會進入阻塞狀態(該狀態既停止當前執行緒,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該執行緒進入可執行狀態,繼續等待os分配時間片;
 6、當執行緒呼叫了yeild()方法,意思是放棄當前獲得的CPU時間片,回到可執行狀態,這時與其他程序處於同等競爭狀態,OS有可能會接著又讓這個程序進入執行狀態;
 7、當執行緒剛進入可執行狀態(即就緒狀態),發現將要呼叫的資源被synchronized(同步),獲取不到鎖標記,將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡也許已經有了其他執行緒在等待獲取鎖標記,這時它們處於佇列狀態,即先到先得)一旦執行緒獲得鎖標記後,就轉入可執行狀態,等待os分配CPU時間片;
 8、當一個執行緒執行到wait()方法時,它就進入到一個和該物件相關的等待池中,同時失去了物件的鎖。它被一個notify()方法喚醒時,等待池中的執行緒就被放到鎖池中。該執行緒從鎖池中獲得鎖,然後回到wait()前的中斷現場。
 9當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所佔有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他執行緒呼叫notify()或notifyAll()方法才能被喚醒(wait(1000)時可以自動喚醒)(由於notify()只是喚醒一個執行緒。但我們由於不能確定具體喚醒的是哪一個執行緒,也許我們需要喚醒的執行緒不能夠喚醒,)因此在實際使用時,一般都用notifyAll(),方法喚醒所有執行緒(),當執行緒被喚醒後會進入鎖池,等待獲得鎖標記

相關推薦

sleep() wait() yeild()三者之間區別

1、sleep()方法會給其他執行緒執行的機會,而不考慮其他執行緒的優先順序,因此會給較低執行緒一個執行的機會;yield()方法只會給相同優先順序或者更高優先順序的執行緒一個執行的機會。  2、當執行緒執行了sleep(long millis)方法後,將轉到阻塞狀態,引

CookieslocalStorage和sessionStorage三者之間區別.md

Cookies、localStorage和sessionStorage三者之間的區別 cookies、localStorage和sessionStorage之間的區別,要從以下幾個方面進行分析: 1.有效期 ​ cookies是會話機制,它是在設定的時間內(自己

getFragmentManager getSupportFragmentManager 與getChildFragmentManager三者之間區別

首先getFragmentManager 、getSupportFragmentManager這個兩個FragmentManager用的最多,Fragment是安卓3.0以後引入的API,FragmentManager是管理Fragment的片段管理器, 簡單

StringStringBuffer與StringBuilder三者區別

不可變 abcd ges 區別 ++ 源碼 重新 strong blog 簡單的說: String:創建的是字符串常量,創建的字符串會放入內存的常量池中,是不可變的對象。如果要對String類型的內容進行改變,實際上每次改變都會重新new一個String類型的字符串對象,指

C#中數組ArrayList和List三者區別

collect comm 兩個 根據 -s lis 數據打包 功能 target 在C#中數組,ArrayList,List都能夠存儲一組對象,那麽這三者到底有什麽樣的區別呢。 數組 數組在C#中最早出現的。在內存中是連續存儲的,所以它的索引速度非常快,而且賦值

C++知識回顧之__stdcall__cdcel和__fastcall三者區別

進行 pan span number 適用於 編譯器 api num 處理 __stdcall、__cdecl和__fastcall是三種函數調用協議,函數調用協議會影響函數參數的入棧方式、棧內數據的清除方式、編譯器函數名的修飾規則等。 調用協議常用場合 __stdca

stringEmpty和null三者區別

指向 空間 AD dst rar 取出 能力 討論 字段 本文轉自 http://www.cnblogs.com/mxxblog/archive/2013/08/22/3275387.html 這是一個及其常見的問題,網上已經有關於這個問題的很多討論。但是我覺得都是不求甚

webpack 3之hashchunkhash和contenthash三者區別

就是 區別 生成 用法 pac put 覆蓋 一個 失效 在使用webpack 3中,文件名的hash值可以有三種hash生成方式,那具體使用哪一種呢? 1.hash 如果都使用hash的話,所有文件的hash都是一樣的,而且每次修改任何一個文件,所有文件名的hash至都將

webpack中hashchunkhash和contenthash三者區別

在webpack中有時需要使用hash來做靜態資源實現增量更新方案之一,檔名的hash值可以有三種hash生成方式,每一種都有不同應用場景,那麼三者有何區別呢? hash、chunkhash、contenthash hash一般是結合CDN快取來使用,通過webpack構建之後,生成對應檔名

執行緒的幾種狀態以及sleep,wait,yield,join的區別

今天第一次寫部落格,因個人能力有限,不到位的地方請大家多多包涵 1.執行緒通常有五種狀態,建立,就緒,執行、阻塞和死亡狀態。 2.阻塞的情況又分為三種: (1)、等待阻塞:執行的執行緒執行wait()方法,該執行緒會釋放佔用的所有資源,JVM會把該執行緒

Qt QStringQByteArray和char* 三者之間的關係

Qt QString、QByteArray和char* 三者之間的關係 QString和QByteArray之間的互轉 QString是Qt的字串類,QByteArray是byte的陣列 1 QString轉QByteArray QString str=QString("hello world!"

getParameter()getInputStream()和getReader() 三者區別

getParameter()、getInputStream()和getReader() 三者都是從selvlet中request物件得到提交的資料,但是用途不同。要根據 form 表單提交資料的編碼方式選擇不同的方法。 form表單中enctype 屬性規定在傳送到伺服器之前應該如何對錶

【網路程式設計】TCP網路程式設計中connect()listen()和accept()三者之間的關係

舉個簡單的例子(以下程式碼只是示範性的,用於說明不同套接字的作用,實際的函式會需要更多的引數): /* 建立用於監聽和接受客戶端連線請求的套接字 */ server_sock = socket(); /* 繫結監聽的IP地址和埠 */ bind(server_sock); /* 開始監聽 */ li

畫素英寸,Dpi 三者區別以及關係

Dpi(每平方英寸畫素數目):影象細節程度的度量 Dpi 代表每平方英寸上所含“點”的數目,它決定了一副影象在細節上到底有多細(儘管並不依賴於你的視覺感受)。但是,什麼是“點”? “點”是一個模糊不清的術語。點可以指的是畫素、畫筆的一“點”或者是一個油墨印跡。 當你置身

cookieLocalStorage 與 SessionStorage三者區別

三者之間的不同: 1、cookie資料始終在同源的http請求中攜帶,即cookie在瀏覽器和伺服器間來回傳遞。而sessionStorage和localStorage不會自動把資料發給伺服器,僅在本地儲存。cookie資料還有路徑(path)的概念,可以限制c

__stdcall__cdcel和__fastcall三者區別

__stdcall、__cdecl和__fastcall是三種函式呼叫協議,函式呼叫協議會影響函式引數的入棧方式、棧內資料的清除方式、編譯器函式名的修飾規則等。 呼叫協議常用場合 __stdcall:Windows API預設的函式呼叫協議。 __cdecl:

【Linux 網路程式設計】TCP網路程式設計中connect()listen()和accept()三者之間的關係

基於 TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下: connect()函式:對於客戶端的 connect() 函式,該函式的功能為客戶端主動連線伺服器,建立連線是通過三次握手,而這個連接的過程是由核心完成,不是這個函式完成的,這個函式的作用僅僅是通知 Linux 核心

conv2函式imfilter與filter2三者區別

conv2函式 1、用法 C=conv2(A,B,shape); %卷積濾波  A:輸入影象,B:卷積核  假設輸入影象A大小為ma x na,卷積核B大小為mb x nb,則  當shape=ful

Java基礎知識之StringStringBuilder和StringBuffer三者區別

String、StringBuilder和StringBuffer這三個類在操作字串時主要有執行速度和執行緒安全這兩方面的區別: 1.執行速度   執行速度,即執行字串操作時程式碼執行的時間快慢,在這方面執行速度快慢為:StringBuilder > StringBuffer >

《Linux網路程式設計》: connect()listen()和accept()三者之間的關係

基於 TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下:   connect()函式 對於客戶端的 connect() 函式,該函式的功能為客戶端主動連線伺服器,建立連線是通過三次握手,而這個連線的過程是由核心完成,不是這個函式完