91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么實現讓線程按照自己指定的順序執行

發布時間:2022-06-30 14:20:19 來源:億速云 閱讀:195 作者:iii 欄目:開發技術

這篇“Java中怎么實現讓線程按照自己指定的順序執行”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java中怎么實現讓線程按照自己指定的順序執行”文章吧。

如何讓線程按照自己指定的順序執行

我們在日常的多線程開發中,可能有時會想讓每個線程都按照我們指定的順序來運行,而不是讓CPU隨機調度,這樣可能會讓我們在日常的開發工作中帶來不必要的麻煩。

既然有了這個需求,也就引入了本文的標題,讓線程按照自己指定的順序來運行。

有興趣的同學可以猜想下列代碼可能運行的結果:

Java中怎么實現讓線程按照自己指定的順序執行

按照正常的理解思路,上面代碼的執行順序依次應該為:t1 → t2 → t3,而實際效果則不是理想的狀態。

下圖為運行效果:

Java中怎么實現讓線程按照自己指定的順序執行

認識Join

join可能對于一些同學來說并不陌生,此處我就不詳細介紹Join是什么了,有疑問的同學可以自行baidu和google。

這里我將直接介紹如何使用join來達到我們希望看到的效果!

Java中怎么實現讓線程按照自己指定的順序執行

這里主要是利用Join的阻塞效果,來達到我們的使用目的。看上圖的運行結果可以得知,程序已經按照我們指定的順序執行結束了,并得到了我們想要的結果。

其實這里可以深入的思考一下,為什么join可以達到我們想要的效果呢?接下來我們來看下源碼:

進入join源碼后,首先看到的是一個傳入0參數的join方法,此處選擇繼續進入。

Java中怎么實現讓線程按照自己指定的順序執行

首先可以看到join方法是線程安全的,其次可以結合上圖一起看,當傳入參數為0時,會命中一個wait(0)的方法,有經驗的同學應該能直接看懂,這里表示等待。

但是需要說明的是,這里的等待絕對不是等待調用者,而是阻塞的主線程,t1,t2,t3只是子線程,當子線程運行完畢后,主線程結束等待。

這里演示了join的工作方式,也證實了join能讓我們在程序中達到自己想要的效果。

Java中怎么實現讓線程按照自己指定的順序執行

除了join能在程序中幫助我們控制線程的順序外,還有另外的方式,比如我們利用線程池實現試一試。

利用Executors線程池

Executors是JDK中java.util.concurrent包下線程池操作類,可以方便的為我們提供線程池的操作。

這里我們使用Executors中的newSingleThreadExecutor()方法,創建一個單線程的線程池。

Java中怎么實現讓線程按照自己指定的順序執行

根據上圖可以得知,利用newSingleThreadExecutor()方法依然能夠達到我們期待的效果,其實原理很簡單,方法內部是一個基于FIFO的隊列,也就是說,當我們依次將t1,t2,t3加入隊列中時,實際在就緒狀態的只有t1這個線程,t2,t3則會被添加到隊列中,當t1執行完畢后,則會繼續執行隊列中的其他線程。

線程的優先級及執行順序

在學習運算符時,讀者知道各個運算符之間有優先級,了解運算符的優先級對程序幵發有很好的作用。線程也是如此,每個線程都具有優先級,Java 虛擬機根據線程的優先級決定線程的執行順序,這樣使多線程合理共享 CPU 資源而不會產生沖突。

優先級概述

在 Java 語言中,線程的優先級范圍是 1~10,值必須在 1~10,否則會出現異常;優先級的默認值為 5。優先級較高的線程會被優先執行,當執行完畢,才會輪到優先級較低的線程執行。如果優先級相同,那么就采用輪流執行的方式。

可以使用 Thread 類中的 setPriority() 方法來設置線程的優先級。語法如下:

public final void setPriority(int newPriority);

如果要獲取當前線程的優先級,可以直接調用 getPriority() 方法。語法如下:

public final int getPriority();

使用優先級

簡單了解過優先級之后,下面通過一個簡單的例子來演示如何使用優先級。

例 1

分別使用 Thread 類和 Runnable 接口創建線程,并為它們指定優先級。

public class FirstThreadInput extends Thread
{
    public void run()
    {
        System.out.println("調用FirstThreadInput類的run()重寫方法");    //輸出字符串
        for(int i=0;i<5;i++)
        {
            System.out.println("FirstThreadInput線程中i="+i);    //輸出信息
            try
            {
                Thread.sleep((int) Math.random()*100);    //線程休眠
            }
            catch(Exception e){}
        }
    }
}

(2) 創建實現 Runnable 接口的 SecondThreadInput 類,實現 run() 方法。代碼如下:

public class SecondThreadInput implements Runnable
{
    public void run()
    {
        System.out.println("調用SecondThreadInput類的run()重寫方法");    //輸出字符串
        for(int i=0;i<5;i++)
        {
            System.out.println("SecondThreadInput線程中i="+i);    //輸出信息
            try
            {
                Thread.sleep((int) Math.random()*100);    //線程休眠
            }
            catch(Exception e){}
        }
    }
}

(3) 創建 TestThreadInput 測試類,分別使用 Thread 類的子類和 Runnable 接口的對象創建線程,然后調用 setPriority() 方法將這兩個線程的優先級設置為 4,最后啟動線程。代碼如下:

public class TestThreadInput
{
    public static void main(String[] args)
    {
        FirstThreadInput fti=new FirstThreadInput();
        Thread sti=new Thread(new SecondThreadInput());
        fti.setPriority(4);
        sti.setPriority(4);
        fti.start();
        sti.start();
    }
}

(4) 運行上述代碼,運行結果如下所示。

調用FirstThreadInput類的run()重寫方法
調用SecondThreadInput類的run()重寫方法
FirstThreadInput線程中i=0
SecondThreadInput線程中i=0
FirstThreadInput線程中i=1
FirstThreadInput線程中i=2
SecondThreadInput線程中i=1
FirstThreadInput線程中i=3
SecondThreadInput線程中i=2
FirstThreadInput線程中i=4
SecondThreadInput線程中i=3
SecondThreadInput線程中i=4

由于該例子將兩個線程的優先級都設置為 4,因此它們交互占用 CPU ,宏觀上處于并行運行狀態。

重新更改 ThreadInput 類的代碼、設置優先級。代碼如下:

fti.setPriority(1);
sti.setPriority(10);

重新運行上述代碼,如下所示。

調用FirstThreadInput類的run()重寫方法
調用SecondThreadInput類的run()重寫方法
FirstThreadInput線程中i=0
SecondThreadInput線程中i=0
SecondThreadInput線程中i=1
SecondThreadInput線程中i=2
SecondThreadInput線程中i=3
SecondThreadInput線程中i=4
FirstThreadInput線程中i=1
FirstThreadInput線程中i=2
FirstThreadInput線程中i=3
FirstThreadInput線程中i=4

以上就是關于“Java中怎么實現讓線程按照自己指定的順序執行”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白城市| 那曲县| 昌平区| 闽侯县| 大石桥市| 三江| 聂荣县| 江山市| 思南县| 介休市| 神农架林区| 朝阳区| 新野县| 西林县| 台北市| 嘉兴市| 湄潭县| 宁强县| 冀州市| 大城县| 固安县| 贵德县| 石嘴山市| 岐山县| 正安县| 武宁县| 灵璧县| 永清县| 镇远县| 南丰县| 通州区| 腾冲县| 建平县| 吴川市| 德惠市| 罗定市| 长海县| 惠水县| 香港| 昌宁县| 清徐县|