教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

什么是線(xiàn)程讓步?

更新時(shí)間:2022年03月01日18時(shí)25分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

在校園中,經(jīng)常會(huì)看到很多同學(xué)一起打籃球,當(dāng)某個(gè)同學(xué)搶到籃球后可以拍一會(huì)兒再傳遞給其他人,大家重新開(kāi)始搶籃球,這個(gè)過(guò)程就相當(dāng)于程序中的線(xiàn)程讓步。線(xiàn)程讓步可以通過(guò)yield()方法來(lái)實(shí)現(xiàn),該方法和sleep(long millis)方法有點(diǎn)類(lèi)似,都可以讓當(dāng)前正在運(yùn)行的線(xiàn)程暫停,區(qū)別在于yield()方法不會(huì)阻塞該線(xiàn)程,它只是將線(xiàn)程轉(zhuǎn)換成就緒狀態(tài),讓系統(tǒng)的調(diào)度器重新調(diào)度一次。當(dāng)某個(gè)線(xiàn)程調(diào)用yield()方法之后,與當(dāng)前線(xiàn)程優(yōu)先級(jí)相同或者更高的線(xiàn)程可以獲得執(zhí)行的機(jī)會(huì)。接下來(lái)通過(guò)一個(gè)案例來(lái)演示yield()方法的使用,如例10-9所示。

例10-9 Example09.java

//定義YieldThread類(lèi)繼承Thread類(lèi)
class YieldThread extends Thread {
    //定義一個(gè)有參的構(gòu)造方法
    public YieldThread(String name) {
        super(name); //調(diào)用父類(lèi)的構(gòu)造方法
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + "---" + i);
                If(i == 2) {
                    System.out.print( "線(xiàn)程讓步:");
                    Thread.yield(); //線(xiàn)程運(yùn)行到此,作出讓步
                }
            }
        }
    }
    public class Example09 {
        public static void main(String[] args) {
            //創(chuàng)建兩個(gè)線(xiàn)程
            Thread threadl1 = new YieldThread("threadl");
            Thread thread2 = new YieldThread("thread2");
            //開(kāi)啟兩個(gè)線(xiàn)程
            Thread1.start();
            thread2.start();
        }
    }

運(yùn)行結(jié)果如圖所示

例10-9中創(chuàng)建了兩個(gè)線(xiàn)程threadl和thread2,它們的優(yōu)先級(jí)相同。兩個(gè)線(xiàn)程在循環(huán)變量i等于2時(shí),都會(huì)調(diào)用Thread的yield()方法,使當(dāng)前線(xiàn)程暫停,讓兩個(gè)線(xiàn)程再次爭(zhēng)奪CUP使用權(quán),從運(yùn)行結(jié)果可以看出,當(dāng)線(xiàn)程thread1輸出2以后,會(huì)做出讓步,線(xiàn)程thread2獲得執(zhí)行權(quán),同樣,線(xiàn)程 thread2輸出2后,也會(huì)做出讓步,線(xiàn)程 threadl獲得執(zhí)行權(quán)。小提示:通過(guò)yield()方法可以實(shí)現(xiàn)線(xiàn)程讓步,讓當(dāng)前正在運(yùn)行的線(xiàn)程失去CPU使用權(quán),讓系統(tǒng)的調(diào)度器重新調(diào)度一次,由于Java虛擬機(jī)默認(rèn)采用搶占式調(diào)度模型,所有線(xiàn)程都會(huì)再次搶占CUP資源使用權(quán),所以在執(zhí)行線(xiàn)程讓步后并不能保證立即執(zhí)行其他線(xiàn)程。





猜你喜歡:

Java線(xiàn)程的生命周期包括哪幾種狀態(tài)?

進(jìn)程和線(xiàn)程的區(qū)別和聯(lián)系是什么?【領(lǐng)取Java并發(fā)教程】

什么是線(xiàn)程?線(xiàn)程的分類(lèi)

Java開(kāi)發(fā)中Netty線(xiàn)程模型原理解析

傳智教育Java高級(jí)軟件工程師培訓(xùn)

0 分享到:
和我們?cè)诰€(xiàn)交談!