摘要:那方法是干什么用的呢來(lái)看下源碼。它讓掉當(dāng)前線(xiàn)程的時(shí)間片,使正在運(yùn)行中的線(xiàn)程重新變成就緒狀態(tài),并重新競(jìng)爭(zhēng)的調(diào)度權(quán)。運(yùn)行以上程序,可以有以下兩種結(jié)果。結(jié)果棧長(zhǎng)讓出了資源,小蜜成功上位。總結(jié)棧長(zhǎng)沒(méi)用過(guò),感覺(jué)沒(méi)什么鳥(niǎo)用。
概念
我們知道 start() 方法是啟動(dòng)線(xiàn)程,讓線(xiàn)程變成就緒狀態(tài)等待 CPU 調(diào)度后執(zhí)行。
那 yield() 方法是干什么用的呢?來(lái)看下源碼。
/** * A hint to the scheduler that the current thread is willing to yield * its current use of a processor. The scheduler is free to ignore this * hint. * *Yield is a heuristic attempt to improve relative progression * between threads that would otherwise over-utilise a CPU. Its use * should be combined with detailed profiling and benchmarking to * ensure that it actually has the desired effect. * *
It is rarely appropriate to use this method. It may be useful * for debugging or testing purposes, where it may help to reproduce * bugs due to race conditions. It may also be useful when designing * concurrency control constructs such as the ones in the * {@link java.util.concurrent.locks} package. */ public static native void yield();
yield 即 "謙讓",也是 Thread 類(lèi)的方法。它讓掉當(dāng)前線(xiàn)程 CPU 的時(shí)間片,使正在運(yùn)行中的線(xiàn)程重新變成就緒狀態(tài),并重新競(jìng)爭(zhēng) CPU 的調(diào)度權(quán)。它可能會(huì)獲取到,也有可能被其他線(xiàn)程獲取到。
實(shí)戰(zhàn)下面是一個(gè)使用示例。
/** * 微信公眾號(hào):Java技術(shù)棧 */ public static void main(String[] args) { Runnable runnable = () -> { for (int i = 0; i <= 100; i++) { System.out.println(Thread.currentThread().getName() + "-----" + i); if (i % 20 == 0) { Thread.yield(); } } }; new Thread(runnable, "棧長(zhǎng)").start(); new Thread(runnable, "小蜜").start(); }
這個(gè)示例每當(dāng)執(zhí)行完 20 個(gè)之后就讓出 CPU,每次謙讓后就會(huì)馬上獲取到調(diào)度權(quán)繼續(xù)執(zhí)行。
運(yùn)行以上程序,可以有以下兩種結(jié)果。
結(jié)果1:棧長(zhǎng)讓出了 CPU 資源,小蜜成功上位。
棧長(zhǎng)-----29 棧長(zhǎng)-----30 小蜜-----26 棧長(zhǎng)-----31
結(jié)果2:棧長(zhǎng)讓出了 CPU 資源,棧長(zhǎng)繼續(xù)運(yùn)行。
棧長(zhǎng)-----28 棧長(zhǎng)-----29 棧長(zhǎng)-----30 棧長(zhǎng)-----31
而如果我們把兩個(gè)線(xiàn)程加上線(xiàn)程優(yōu)先級(jí),那輸出的結(jié)果又不一樣。
thread1.setPriority(Thread.MIN_PRIORITY); thread2.setPriority(Thread.MAX_PRIORITY);
因?yàn)榻o小蜜加了最高優(yōu)先權(quán),棧長(zhǎng)加了最低優(yōu)先權(quán),即使棧長(zhǎng)先啟動(dòng),那小蜜還是有很大的概率比棧長(zhǎng)先會(huì)輸出完的,大家可以試一下。
yield 和 sleep 的異同1)yield, sleep 都能暫停當(dāng)前線(xiàn)程,sleep 可以指定具體休眠的時(shí)間,而 yield 則依賴(lài) CPU 的時(shí)間片劃分。
2)yield, sleep 兩個(gè)在暫停過(guò)程中,如已經(jīng)持有鎖,則都不會(huì)釋放鎖資源。
3)yield 不能被中斷,而 sleep 則可以接受中斷。
總結(jié)棧長(zhǎng)沒(méi)用過(guò) yield,感覺(jué)沒(méi)什么鳥(niǎo)用。
如果一定要用它的話(huà),一句話(huà)解釋就是:yield 方法可以很好的控制多線(xiàn)程,如執(zhí)行某項(xiàng)復(fù)雜的任務(wù)時(shí),如果擔(dān)心占用資源過(guò)多,可以在完成某個(gè)重要的工作后使用 yield 方法讓掉當(dāng)前 CPU 的調(diào)度權(quán),等下次獲取到再繼續(xù)執(zhí)行,這樣不但能完成自己的重要工作,也能給其他線(xiàn)程一些運(yùn)行的機(jī)會(huì),避免一個(gè)線(xiàn)程長(zhǎng)時(shí)間占有 CPU 資源。
動(dòng)手轉(zhuǎn)發(fā)給更多的朋友吧!
更多 Java 多線(xiàn)程技術(shù)文章請(qǐng)?jiān)贘ava技術(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字:多線(xiàn)程。
本文原創(chuàng)首發(fā)于微信公眾號(hào):Java技術(shù)棧(id:javastack),關(guān)注公眾號(hào)在后臺(tái)回復(fù) "多線(xiàn)程" 可獲取更多,轉(zhuǎn)載請(qǐng)?jiān)瓨颖A舯拘畔ⅰ?/pre>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/72301.html
摘要:如果線(xiàn)程還存活,線(xiàn)程就無(wú)限期等待,并讓出監(jiān)視器鎖,進(jìn)入狀態(tài)。當(dāng)線(xiàn)程從狀態(tài)被喚醒后通過(guò),或者是假喚醒將繼續(xù)競(jìng)爭(zhēng)監(jiān)視器鎖,當(dāng)成功獲得監(jiān)視器鎖后,他將從調(diào)用的地方恢復(fù),繼續(xù)運(yùn)行。 前言 系列文章目錄 上一篇我們討論了線(xiàn)程的創(chuàng)建,本篇我們來(lái)聊一聊線(xiàn)程的狀態(tài)轉(zhuǎn)換以及常用的幾個(gè)比較重要的方法。 本篇依然是通過(guò)源碼分析來(lái)了解這些知識(shí)。 本文源碼基于jdk1.8 。 閱讀完本文,你應(yīng)當(dāng)有能力回答以...
摘要:判斷目標(biāo)線(xiàn)程是否被中斷,會(huì)清除中斷標(biāo)記。技術(shù)棧線(xiàn)程休眠被中斷,程序退出。示例全部信息輸出并正常退出,只是在方法被中斷并清除標(biāo)記后手動(dòng)重新中斷當(dāng)前線(xiàn)程,然后程序接收中斷信號(hào)返回退出。通過(guò)以上個(gè)中斷示例,相信對(duì)線(xiàn)程中斷的概念有了全面的了解。 在之前的一文《如何優(yōu)雅地終止一個(gè)線(xiàn)程》中詳細(xì)說(shuō)明了 stop 終止線(xiàn)程的壞處及如何優(yōu)雅地終止線(xiàn)程,那么還有別的可以終止線(xiàn)程的方法嗎?答案是肯定的,它就...
摘要:通知任一一個(gè)進(jìn)入等待狀態(tài)的線(xiàn)程,通知所有讓調(diào)用線(xiàn)程阻塞在這個(gè)方法上,直到的線(xiàn)程完全執(zhí)行完畢,調(diào)用線(xiàn)程才會(huì)繼續(xù)執(zhí)行。通知調(diào)度器,主動(dòng)讓出對(duì)的占用。 多線(xiàn)程在開(kāi)發(fā)知識(shí)中是一個(gè)很重要的部分,然而實(shí)際生產(chǎn)中卻很少遇到真正需要自己去處理多線(xiàn)程編程里的那些復(fù)雜細(xì)節(jié)和問(wèn)題,因?yàn)楹芏鄷r(shí)候,都有一套架構(gòu)或者一些框架幫大部分業(yè)務(wù)程序員隱藏了多線(xiàn)程的細(xì)節(jié),大多時(shí)候只需要簡(jiǎn)單的實(shí)現(xiàn)各種業(yè)務(wù)邏輯即可。 今天來(lái)理...
摘要:目標(biāo)線(xiàn)程由運(yùn)行狀態(tài)轉(zhuǎn)換為就緒狀態(tài),也就是讓出執(zhí)行權(quán)限,讓其他線(xiàn)程得以?xún)?yōu)先執(zhí)行,但其他線(xiàn)程能否優(yōu)先執(zhí)行時(shí)未知的。函數(shù)的官方解釋是意思是使調(diào)用該函數(shù)的線(xiàn)程讓出執(zhí)行時(shí)間給其他已就緒狀態(tài)的線(xiàn)程。 線(xiàn)程允許在同一個(gè)進(jìn)程中同時(shí)存在多個(gè)程序控制流,即通過(guò)線(xiàn)程可以實(shí)現(xiàn)同時(shí)處理多個(gè)任務(wù)的功能。線(xiàn)程會(huì)共享進(jìn)程范圍內(nèi)的資源,例如內(nèi)存句柄和文件句柄,但每個(gè)線(xiàn)程都有各自的程序計(jì)數(shù)器、棧以及局部變量。 多線(xiàn)程的實(shí)...
閱讀 1353·2023-04-26 00:35
閱讀 2723·2023-04-25 18:32
閱讀 3370·2021-11-24 11:14
閱讀 780·2021-11-22 15:24
閱讀 1428·2021-11-18 10:07
閱讀 6535·2021-09-22 10:57
閱讀 2782·2021-09-07 09:58
閱讀 3572·2019-08-30 15:54