摘要:但是,實際中無法保證達到讓步目的,因為讓步的線程還有可能被線程調(diào)度程序再次選中。在大多數(shù)情況下,將導(dǎo)致線程從運行狀態(tài)轉(zhuǎn)到可運行狀態(tài),但有可能沒有效果。
多線程編程 線程狀態(tài)圖
總是無法上傳,稍后上傳常用函數(shù)
狀態(tài)轉(zhuǎn)換 運行中->阻塞
sleep(long millis) 在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠
join() 等待t線程終止
使用方式
Thread t = new Thread1(); t.start(); t.join();
主線程進入阻塞狀態(tài),需要等待t線程執(zhí)行結(jié)束后,才能進入可運行狀態(tài),等待cpu執(zhí)行。
狀態(tài)轉(zhuǎn)換 運行中->可運行
yield() 暫停當(dāng)前正在執(zhí)行的線程對象,并執(zhí)行其他線程
yield()應(yīng)該做的是讓當(dāng)前運行線程回到可運行狀態(tài),以允許具有相同優(yōu)先級的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優(yōu)先級的線程之間能適當(dāng)?shù)妮嗈D(zhuǎn)執(zhí)行。但是,實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調(diào)度程序再次選中。yield()從未導(dǎo)致線程轉(zhuǎn)到等待/睡眠/阻塞狀態(tài)。在大多數(shù)情況下,yield()將導(dǎo)致線程從運行狀態(tài)轉(zhuǎn)到可運行狀態(tài),但有可能沒有效果。 **sleep()和yield()的區(qū)別** sleep()和yield()的區(qū)別):sleep()使當(dāng)前線程進入停滯狀態(tài),所以執(zhí)行sleep()的線程在指定的時間內(nèi)肯定不會被執(zhí)行;yield()只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。sleep 方法使當(dāng)前運行中的線程睡眼一段時間,進入不可運行狀態(tài),這段時間的長短是由程序設(shè)定的,yield 方法使當(dāng)前線程讓出 CPU 占有權(quán),但讓出的時間是不可設(shè)定的。實際上,yield()方法對應(yīng)了如下操作:先檢測當(dāng)前是否有相同優(yōu)先級的線程處于同可運行狀態(tài),如有,則把 CPU 的占有權(quán)交給此線程,否則,繼續(xù)運行原來的線程。所以yield()方法稱為“退讓”,它把運行機會讓給了同等優(yōu)先級的其他線程。 另外,sleep 方法允許較低優(yōu)先級的線程獲得運行機會,但 yield() 方法執(zhí)行時,當(dāng)前線程仍處在可運行狀態(tài),所以,不可能讓出較低優(yōu)先級的線程些時獲得 CPU 占有權(quán)。在一個運行系統(tǒng)中,如果較高優(yōu)先級的線程沒有調(diào)用 sleep 方法,又沒有受到 IO 阻塞,那么,較低優(yōu)先級線程只能等待所有較高優(yōu)先級的線程運行結(jié)束,才有機會運行。
運行中->等待隊列
```o.wait()``` Obj.wait(),與Obj.notify()必須要與synchronized(Obj)一起使用,也就是wait,與notify是針對已經(jīng)獲取了Obj鎖進行操作,從語法角度來說就是Obj.wait(),Obj.notify*必須在synchronized(Obj){...}語句塊內(nèi)*。從功能上來說wait就是說線程在獲取對象鎖后,主動釋放對象鎖,同時本線程休眠。直到有其它線程調(diào)用對象的notify()喚醒該線程,才能繼續(xù)獲取對象鎖,并繼續(xù)執(zhí)行。相應(yīng)的notify()就是對對象鎖的喚醒操作。但有一點需要注意的是*notify()調(diào)用*后,*并不是馬上就釋放對象鎖的*,而是在相應(yīng)的synchronized(){}語句塊執(zhí)行結(jié)束,自動釋放鎖后,JVM會在wait()對象鎖的線程中隨機選取一線程,賦予其對象鎖,喚醒線程,繼續(xù)執(zhí)行。這樣就提供了在線程間同步、喚醒的操作。Thread.sleep()與Object.wait()二者都可以暫停當(dāng)前線程,釋放CPU控制權(quán),主要的區(qū)別在于Object.wait()在釋放CPU同時,釋放了對象鎖的控制。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70153.html
摘要:一基礎(chǔ)接口的意義百度規(guī)范擴展回調(diào)抽象類的意義想不想通過一線互聯(lián)網(wǎng)公司面試文檔整理為電子書掘金簡介谷歌求職記我花了八個月準(zhǔn)備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對象深入分析 Java 中實例變量和類變量的區(qū)別 - 掘金原創(chuàng)文章,轉(zhuǎn)載請務(wù)必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪問我的站點,閱讀更多有深度的文章。 實例變量 和 類變量...
摘要:正確做法是給加索引,還有聯(lián)合索引,并不能避免全表掃描。 前言:有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連 有心的同學(xué)應(yīng)該會看到我這個noteBook下面的其它知識,希望對你們有些許幫助。 本文地址 時間點:2017-11 一個16年畢業(yè)生所經(jīng)歷的php面試 一、什么是面試 二、面試準(zhǔn)備 1. 問:什么時候開始準(zhǔn)備? 2. 問:怎么準(zhǔn)備? 三、面試...
摘要:把準(zhǔn)備過程紀(jì)錄下來,共勉。單例模式有幾種經(jīng)典寫法,核心思想就是將構(gòu)造函數(shù)私有化,并且通過靜態(tài)方法獲取一個唯一的實例。 寫在最前面 導(dǎo)師貪腐出逃美國,兩年未歸,可憐了我。拿了小米和美團的offer,要被延期,offer失效,工作重新找。把準(zhǔn)備過程紀(jì)錄下來,共勉。 單例模式有幾種經(jīng)典寫法,核心思想:就是將構(gòu)造函數(shù)私有化,并且通過靜態(tài)方法獲取一個唯一的實例。 餓漢式 public c...
摘要:我自己總結(jié)的學(xué)習(xí)的系統(tǒng)知識點以及面試問題,已經(jīng)開源,目前已經(jīng)。面試官那你都了解里面的哪些東西呢我哈哈哈這可是我的強項,從,說到,,又說到線程池,分別說了底層實現(xiàn)和項目中的應(yīng)用。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識點以及面試問題,已經(jīng)開源,目前已經(jīng) 35k+ Star。會一直完善下去,歡迎建議和指導(dǎo),同時也歡迎Star: https://github.com/Snailclimb... ...
閱讀 1696·2021-11-23 09:51
閱讀 3218·2021-09-26 10:21
閱讀 814·2021-09-09 09:32
閱讀 893·2019-08-29 16:06
閱讀 3322·2019-08-26 13:36
閱讀 783·2019-08-26 10:56
閱讀 2575·2019-08-26 10:44
閱讀 1155·2019-08-23 14:04