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

資訊專欄INFORMATION COLUMN

多線程 Thread.yield 方法到底有什么用?

yzd / 3565人閱讀

摘要:那方法是干什么用的呢來看下源碼。它讓掉當前線程的時間片,使正在運行中的線程重新變成就緒狀態(tài),并重新競爭的調(diào)度權(quán)。運行以上程序,可以有以下兩種結(jié)果。結(jié)果棧長讓出了資源,小蜜成功上位。總結(jié)棧長沒用過,感覺沒什么鳥用。

概念

我們知道 start() 方法是啟動線程,讓線程變成就緒狀態(tài)等待 CPU 調(diào)度后執(zhí)行。

那 yield() 方法是干什么用的呢?來看下源碼。

/**
 * 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 類的方法。它讓掉當前線程 CPU 的時間片,使正在運行中的線程重新變成就緒狀態(tài),并重新競爭 CPU 的調(diào)度權(quán)。它可能會獲取到,也有可能被其他線程獲取到。

實戰(zhàn)

下面是一個使用示例。

/**
 * 微信公眾號: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, "棧長").start();
    new Thread(runnable, "小蜜").start();
}

這個示例每當執(zhí)行完 20 個之后就讓出 CPU,每次謙讓后就會馬上獲取到調(diào)度權(quán)繼續(xù)執(zhí)行。

運行以上程序,可以有以下兩種結(jié)果。

結(jié)果1:棧長讓出了 CPU 資源,小蜜成功上位。

棧長-----29
棧長-----30
小蜜-----26
棧長-----31

結(jié)果2:棧長讓出了 CPU 資源,棧長繼續(xù)運行。

棧長-----28
棧長-----29
棧長-----30
棧長-----31

而如果我們把兩個線程加上線程優(yōu)先級,那輸出的結(jié)果又不一樣。

thread1.setPriority(Thread.MIN_PRIORITY);
thread2.setPriority(Thread.MAX_PRIORITY);

因為給小蜜加了最高優(yōu)先權(quán),棧長加了最低優(yōu)先權(quán),即使棧長先啟動,那小蜜還是有很大的概率比棧長先會輸出完的,大家可以試一下。

yield 和 sleep 的異同

1)yield, sleep 都能暫停當前線程,sleep 可以指定具體休眠的時間,而 yield 則依賴 CPU 的時間片劃分。

2)yield, sleep 兩個在暫停過程中,如已經(jīng)持有鎖,則都不會釋放鎖資源。

3)yield 不能被中斷,而 sleep 則可以接受中斷。

總結(jié)

棧長沒用過 yield,感覺沒什么鳥用。

如果一定要用它的話,一句話解釋就是:yield 方法可以很好的控制多線程,如執(zhí)行某項復(fù)雜的任務(wù)時,如果擔心占用資源過多,可以在完成某個重要的工作后使用 yield 方法讓掉當前 CPU 的調(diào)度權(quán),等下次獲取到再繼續(xù)執(zhí)行,這樣不但能完成自己的重要工作,也能給其他線程一些運行的機會,避免一個線程長時間占有 CPU 資源。

動手轉(zhuǎn)發(fā)給更多的朋友吧!

更多 Java 多線程技術(shù)文章請在Java技術(shù)棧微信公眾號后臺回復(fù)關(guān)鍵字:多線程。

本文原創(chuàng)首發(fā)于微信公眾號:Java技術(shù)棧(id:javastack),關(guān)注公眾號在后臺回復(fù) "多線程" 可獲取更多,轉(zhuǎn)載請原樣保留本信息。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72301.html

相關(guān)文章

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

    摘要:如果線程還存活,線程就無限期等待,并讓出監(jiān)視器鎖,進入狀態(tài)。當線程從狀態(tài)被喚醒后通過,或者是假喚醒將繼續(xù)競爭監(jiān)視器鎖,當成功獲得監(jiān)視器鎖后,他將從調(diào)用的地方恢復(fù),繼續(xù)運行。 前言 系列文章目錄 上一篇我們討論了線程的創(chuàng)建,本篇我們來聊一聊線程的狀態(tài)轉(zhuǎn)換以及常用的幾個比較重要的方法。 本篇依然是通過源碼分析來了解這些知識。 本文源碼基于jdk1.8 。 閱讀完本文,你應(yīng)當有能力回答以...

    luqiuwen 評論0 收藏0
  • 一文搞懂 Java 線程中斷

    摘要:判斷目標線程是否被中斷,會清除中斷標記。技術(shù)棧線程休眠被中斷,程序退出。示例全部信息輸出并正常退出,只是在方法被中斷并清除標記后手動重新中斷當前線程,然后程序接收中斷信號返回退出。通過以上個中斷示例,相信對線程中斷的概念有了全面的了解。 在之前的一文《如何優(yōu)雅地終止一個線程》中詳細說明了 stop 終止線程的壞處及如何優(yōu)雅地終止線程,那么還有別的可以終止線程的方法嗎?答案是肯定的,它就...

    BDEEFE 評論0 收藏0
  • 線程編程:wait, notify, join, yield

    摘要:通知任一一個進入等待狀態(tài)的線程,通知所有讓調(diào)用線程阻塞在這個方法上,直到的線程完全執(zhí)行完畢,調(diào)用線程才會繼續(xù)執(zhí)行。通知調(diào)度器,主動讓出對的占用。 多線程在開發(fā)知識中是一個很重要的部分,然而實際生產(chǎn)中卻很少遇到真正需要自己去處理多線程編程里的那些復(fù)雜細節(jié)和問題,因為很多時候,都有一套架構(gòu)或者一些框架幫大部分業(yè)務(wù)程序員隱藏了多線程的細節(jié),大多時候只需要簡單的實現(xiàn)各種業(yè)務(wù)邏輯即可。 今天來理...

    lovXin 評論0 收藏0
  • Java并發(fā)編程之線程線程

    摘要:目標線程由運行狀態(tài)轉(zhuǎn)換為就緒狀態(tài),也就是讓出執(zhí)行權(quán)限,讓其他線程得以優(yōu)先執(zhí)行,但其他線程能否優(yōu)先執(zhí)行時未知的。函數(shù)的官方解釋是意思是使調(diào)用該函數(shù)的線程讓出執(zhí)行時間給其他已就緒狀態(tài)的線程。 線程允許在同一個進程中同時存在多個程序控制流,即通過線程可以實現(xiàn)同時處理多個任務(wù)的功能。線程會共享進程范圍內(nèi)的資源,例如內(nèi)存句柄和文件句柄,但每個線程都有各自的程序計數(shù)器、棧以及局部變量。 多線程的實...

    wums 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<