国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

多線(xiàn)程 Thread.yield 方法到底有什么用?

yzd / 3573人閱讀

摘要:那方法是干什么用的呢來(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

相關(guān)文章

  • Thread類(lèi)源碼解讀(2)——線(xiàn)程狀態(tài)及常方法

    摘要:如果線(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)有能力回答以...

    luqiuwen 評(píng)論0 收藏0
  • 一文搞懂 Java 線(xiàn)程中斷

    摘要:判斷目標(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)程的方法嗎?答案是肯定的,它就...

    BDEEFE 評(píng)論0 收藏0
  • 線(xiàn)程編程:wait, notify, join, yield

    摘要:通知任一一個(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)理...

    lovXin 評(píng)論0 收藏0
  • Java并發(fā)編程之線(xiàn)程線(xiàn)程

    摘要:目標(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í)...

    wums 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<