成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行

本篇內(nèi)容主要講解“Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行”吧!

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括相山網(wǎng)站建設(shè)、相山網(wǎng)站制作、相山網(wǎng)頁(yè)制作以及相山網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,相山網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到相山省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

如何讓線(xiàn)程按照自己指定的順序執(zhí)行

我們?cè)谌粘5亩嗑€(xiàn)程開(kāi)發(fā)中,可能有時(shí)會(huì)想讓每個(gè)線(xiàn)程都按照我們指定的順序來(lái)運(yùn)行,而不是讓CPU隨機(jī)調(diào)度,這樣可能會(huì)讓我們?cè)谌粘5拈_(kāi)發(fā)工作中帶來(lái)不必要的麻煩。

既然有了這個(gè)需求,也就引入了本文的標(biāo)題,讓線(xiàn)程按照自己指定的順序來(lái)運(yùn)行。

有興趣的同學(xué)可以猜想下列代碼可能運(yùn)行的結(jié)果:

Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行

按照正常的理解思路,上面代碼的執(zhí)行順序依次應(yīng)該為:t1 → t2 → t3,而實(shí)際效果則不是理想的狀態(tài)。

下圖為運(yùn)行效果:

Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行

認(rèn)識(shí)Join

join可能對(duì)于一些同學(xué)來(lái)說(shuō)并不陌生,此處我就不詳細(xì)介紹Join是什么了,有疑問(wèn)的同學(xué)可以自行baidu和google。

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

Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行

這里主要是利用Join的阻塞效果,來(lái)達(dá)到我們的使用目的??瓷蠄D的運(yùn)行結(jié)果可以得知,程序已經(jīng)按照我們指定的順序執(zhí)行結(jié)束了,并得到了我們想要的結(jié)果。

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

進(jìn)入join源碼后,首先看到的是一個(gè)傳入0參數(shù)的join方法,此處選擇繼續(xù)進(jìn)入。

Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行

首先可以看到j(luò)oin方法是線(xiàn)程安全的,其次可以結(jié)合上圖一起看,當(dāng)傳入?yún)?shù)為0時(shí),會(huì)命中一個(gè)wait(0)的方法,有經(jīng)驗(yàn)的同學(xué)應(yīng)該能直接看懂,這里表示等待。

但是需要說(shuō)明的是,這里的等待絕對(duì)不是等待調(diào)用者,而是阻塞的主線(xiàn)程,t1,t2,t3只是子線(xiàn)程,當(dāng)子線(xiàn)程運(yùn)行完畢后,主線(xiàn)程結(jié)束等待。

這里演示了join的工作方式,也證實(shí)了join能讓我們?cè)诔绦蛑羞_(dá)到自己想要的效果。

Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行

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

利用Executors線(xiàn)程池

Executors是JDK中java.util.concurrent包下線(xiàn)程池操作類(lèi),可以方便的為我們提供線(xiàn)程池的操作。

這里我們使用Executors中的newSingleThreadExecutor()方法,創(chuàng)建一個(gè)單線(xiàn)程的線(xiàn)程池。

Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行

根據(jù)上圖可以得知,利用newSingleThreadExecutor()方法依然能夠達(dá)到我們期待的效果,其實(shí)原理很簡(jiǎn)單,方法內(nèi)部是一個(gè)基于FIFO的隊(duì)列,也就是說(shuō),當(dāng)我們依次將t1,t2,t3加入隊(duì)列中時(shí),實(shí)際在就緒狀態(tài)的只有t1這個(gè)線(xiàn)程,t2,t3則會(huì)被添加到隊(duì)列中,當(dāng)t1執(zhí)行完畢后,則會(huì)繼續(xù)執(zhí)行隊(duì)列中的其他線(xiàn)程。

線(xiàn)程的優(yōu)先級(jí)及執(zhí)行順序

在學(xué)習(xí)運(yùn)算符時(shí),讀者知道各個(gè)運(yùn)算符之間有優(yōu)先級(jí),了解運(yùn)算符的優(yōu)先級(jí)對(duì)程序幵發(fā)有很好的作用。線(xiàn)程也是如此,每個(gè)線(xiàn)程都具有優(yōu)先級(jí),Java 虛擬機(jī)根據(jù)線(xiàn)程的優(yōu)先級(jí)決定線(xiàn)程的執(zhí)行順序,這樣使多線(xiàn)程合理共享 CPU 資源而不會(huì)產(chǎn)生沖突。

優(yōu)先級(jí)概述

在 Java 語(yǔ)言中,線(xiàn)程的優(yōu)先級(jí)范圍是 1~10,值必須在 1~10,否則會(huì)出現(xiàn)異常;優(yōu)先級(jí)的默認(rèn)值為 5。優(yōu)先級(jí)較高的線(xiàn)程會(huì)被優(yōu)先執(zhí)行,當(dāng)執(zhí)行完畢,才會(huì)輪到優(yōu)先級(jí)較低的線(xiàn)程執(zhí)行。如果優(yōu)先級(jí)相同,那么就采用輪流執(zhí)行的方式。

可以使用 Thread 類(lèi)中的 setPriority() 方法來(lái)設(shè)置線(xiàn)程的優(yōu)先級(jí)。語(yǔ)法如下:

public final void setPriority(int newPriority);

如果要獲取當(dāng)前線(xiàn)程的優(yōu)先級(jí),可以直接調(diào)用 getPriority() 方法。語(yǔ)法如下:

public final int getPriority();
使用優(yōu)先級(jí)

簡(jiǎn)單了解過(guò)優(yōu)先級(jí)之后,下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)演示如何使用優(yōu)先級(jí)。

例 1

分別使用 Thread 類(lèi)和 Runnable 接口創(chuàng)建線(xiàn)程,并為它們指定優(yōu)先級(jí)。

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

(2) 創(chuàng)建實(shí)現(xiàn) Runnable 接口的 SecondThreadInput 類(lèi),實(shí)現(xiàn) run() 方法。代碼如下:

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

(3) 創(chuàng)建 TestThreadInput 測(cè)試類(lèi),分別使用 Thread 類(lèi)的子類(lèi)和 Runnable 接口的對(duì)象創(chuàng)建線(xiàn)程,然后調(diào)用 setPriority() 方法將這兩個(gè)線(xiàn)程的優(yōu)先級(jí)設(shè)置為 4,最后啟動(dòng)線(xiàn)程。代碼如下:

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) 運(yùn)行上述代碼,運(yùn)行結(jié)果如下所示。

調(diào)用FirstThreadInput類(lèi)的run()重寫(xiě)方法
調(diào)用SecondThreadInput類(lèi)的run()重寫(xiě)方法
FirstThreadInput線(xiàn)程中i=0
SecondThreadInput線(xiàn)程中i=0
FirstThreadInput線(xiàn)程中i=1
FirstThreadInput線(xiàn)程中i=2
SecondThreadInput線(xiàn)程中i=1
FirstThreadInput線(xiàn)程中i=3
SecondThreadInput線(xiàn)程中i=2
FirstThreadInput線(xiàn)程中i=4
SecondThreadInput線(xiàn)程中i=3
SecondThreadInput線(xiàn)程中i=4

由于該例子將兩個(gè)線(xiàn)程的優(yōu)先級(jí)都設(shè)置為 4,因此它們交互占用 CPU ,宏觀(guān)上處于并行運(yùn)行狀態(tài)。

重新更改 ThreadInput 類(lèi)的代碼、設(shè)置優(yōu)先級(jí)。代碼如下:

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

重新運(yùn)行上述代碼,如下所示。

調(diào)用FirstThreadInput類(lèi)的run()重寫(xiě)方法
調(diào)用SecondThreadInput類(lèi)的run()重寫(xiě)方法
FirstThreadInput線(xiàn)程中i=0
SecondThreadInput線(xiàn)程中i=0
SecondThreadInput線(xiàn)程中i=1
SecondThreadInput線(xiàn)程中i=2
SecondThreadInput線(xiàn)程中i=3
SecondThreadInput線(xiàn)程中i=4
FirstThreadInput線(xiàn)程中i=1
FirstThreadInput線(xiàn)程中i=2
FirstThreadInput線(xiàn)程中i=3
FirstThreadInput線(xiàn)程中i=4

到此,相信大家對(duì)“Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前標(biāo)題:Java中如何實(shí)現(xiàn)讓線(xiàn)程按照自己指定的順序執(zhí)行
鏈接分享:http://jinyejixie.com/article20/ijdpco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站虛擬主機(jī)、網(wǎng)站建設(shè)企業(yè)建站、網(wǎng)站內(nèi)鏈App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
庄河市| 萨嘎县| 全椒县| 双牌县| 陈巴尔虎旗| 新河县| 轮台县| 二手房| 洛南县| 大渡口区| 泸定县| 神农架林区| 屏边| 丹棱县| 闽侯县| 灵武市| 社旗县| 宣化县| 明光市| 宝兴县| 顺平县| 遂川县| 宜川县| 星座| 建湖县| 文山县| 平山县| 平和县| 潞西市| 手机| 根河市| 无锡市| 庄河市| 黄浦区| 固始县| 醴陵市| 武宁县| 宁乡县| 五河县| 乌苏市| 宁明县|