最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java讓多線程按順序執(zhí)行的幾種方法

 更新時(shí)間:2022年05月03日 11:57:22   作者:Jqcode  
本文主要介紹了Java讓多線程按順序執(zhí)行的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

文章介紹4種方法,簡單易懂,通過4個(gè)demo拋磚引玉。

在子線程中通過join()方法指定順序

通過join()方法使當(dāng)前線程“阻塞”,等待指定線程執(zhí)行完畢后繼續(xù)執(zhí)行。舉例:在線程thread2中,加上一句thread1.join(),其意義在于,當(dāng)前線程2運(yùn)行到此行代碼時(shí)會(huì)進(jìn)入阻塞狀態(tài),直到線程thread1執(zhí)行完畢后,線程thread2才會(huì)繼續(xù)運(yùn)行,這就保證了線程thread1與線程thread2的運(yùn)行順序。

public class ThreadJoinDemo {
    public static void main(String[] args) throws InterruptedException {
        final Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("打開冰箱!");
            }
        });
 
        final Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    thread1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("拿出一瓶牛奶!");
            }
        });
 
        final Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    thread2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("關(guān)上冰箱!");
            }
        });
 
        //下面三行代碼順序可隨意調(diào)整,程序運(yùn)行結(jié)果不受影響,因?yàn)槲覀冊谧泳€程中通過“join()方法”已經(jīng)指定了運(yùn)行順序。
        thread3.start();
        thread2.start();
        thread1.start();
 
    }
}

運(yùn)行結(jié)果:

打開冰箱!
拿出一瓶牛奶!
關(guān)上冰箱!

在主線程中通過join()方法指定順序

簡單說一下子線程與主線程的區(qū)別,子線程指的是發(fā)生在Thread內(nèi)部的代碼,主線程指的是發(fā)生在main函數(shù)中的代碼,我們可以在main函數(shù)中通過join()方法讓主線程阻塞等待以達(dá)到指定順序執(zhí)行的目的。

public class ThreadMainJoinDemo {
    public static void main(String[] args) throws InterruptedException {
        final Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("打開冰箱!");
            }
        });
 
        final Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("拿出一瓶牛奶!");
            }
        });
 
        final Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("關(guān)上冰箱!");
            }
        });
 
        thread1.start();
        thread1.join();
        thread2.start();
        thread2.join();
        thread3.start();
    }
}

輸出結(jié)果:

打開冰箱!
拿出一瓶牛奶!
關(guān)上冰箱!

通過倒數(shù)計(jì)時(shí)器CountDownLatch實(shí)現(xiàn)

CountDownLatch通過計(jì)數(shù)器提供了更靈活的控制,只要檢測到計(jì)數(shù)器為0當(dāng)前線程就可以往下執(zhí)行而不用管相應(yīng)的thread是否執(zhí)行完畢。

public class ThreadCountDownLatchDemo {
 
    private static CountDownLatch countDownLatch1 = new CountDownLatch(1);
 
    private static CountDownLatch countDownLatch2 = new CountDownLatch(1);
 
    public static void main(String[] args) {
        final Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("打開冰箱!");
                countDownLatch1.countDown();
            }
        });
 
        final Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    countDownLatch1.await();
                    System.out.println("拿出一瓶牛奶!");
                    countDownLatch2.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
 
        final Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    countDownLatch2.await();
                    System.out.println("關(guān)上冰箱!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
 
        //下面三行代碼順序可隨意調(diào)整,程序運(yùn)行結(jié)果不受影響
        thread3.start();
        thread1.start();
        thread2.start();
    }
}

輸出結(jié)果:

打開冰箱!
拿出一瓶牛奶!
關(guān)上冰箱!

通過創(chuàng)建單一化線程池newSingleThreadExecutor()實(shí)現(xiàn)

單線程化線程池(newSingleThreadExecutor)的優(yōu)點(diǎn),串行執(zhí)行所有任務(wù)。

public class ThreadPoolDemo {
 
   static ExecutorService executorService = Executors.newSingleThreadExecutor();
 
    public static void main(String[] args) {
        final Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("打開冰箱!");
            }
        });
 
        final Thread thread2 =new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("拿出一瓶牛奶!");
            }
        });
 
        final Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("關(guān)上冰箱!");
            }
        });
        executorService.submit(thread1);
        executorService.submit(thread2);
        executorService.submit(thread3);
        executorService.shutdown();        //使用完畢記得關(guān)閉線程池
    }
 
}

輸出結(jié)果:

打開冰箱!
拿出一瓶牛奶!
關(guān)上冰箱!

到此這篇關(guān)于Java讓多線程按順序執(zhí)行的幾種方法的文章就介紹到這了,更多相關(guān)Java多線程按順序執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java定時(shí)/延時(shí)任務(wù)之Timer用法詳解

    Java定時(shí)/延時(shí)任務(wù)之Timer用法詳解

    在?Java?Development?Kit?(JDK)?中,java.util.Timer?是一個(gè)用于調(diào)度任務(wù)的工具類,本文主要來和大家聊聊Timer的用法,有需要的小伙伴可以了解下
    2024-12-12
  • Mybatis+Druid+MybatisPlus多數(shù)據(jù)源配置方法

    Mybatis+Druid+MybatisPlus多數(shù)據(jù)源配置方法

    在項(xiàng)目開發(fā)中,經(jīng)常需要連接多個(gè)數(shù)據(jù)庫,使用Mybatis、Druid和MybatisPlus可以實(shí)現(xiàn)多數(shù)據(jù)源配置,通過定義配置類和修改配置文件,如properties或yaml,可以設(shè)置多個(gè)數(shù)據(jù)源,本文介紹了配置項(xiàng)包括Druid基本配置、數(shù)據(jù)源一、數(shù)據(jù)源二,感興趣的朋友一起看看吧
    2024-09-09
  • Java調(diào)用groovy腳本的方式分享

    Java調(diào)用groovy腳本的方式分享

    Groovy?是一種基于?JVM?的動(dòng)態(tài)語言,與?Java?語言緊密集成,可以很方便地在?Java?項(xiàng)目中使用。本文為大家整理了Java調(diào)用groovy腳本的幾種方式,希望對(duì)大家有所幫助
    2023-04-04
  • Java語言Lang包下常用的工具類介紹

    Java語言Lang包下常用的工具類介紹

    這篇文章主要介紹了Java語言Lang包下常用的工具類介紹,次奧變覺得挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • Java中的AQS同步隊(duì)列問題詳解

    Java中的AQS同步隊(duì)列問題詳解

    AQS?提供一套基礎(chǔ)的機(jī)制來實(shí)現(xiàn)線程的同步、阻塞與喚醒、等待隊(duì)列等功能,也就是想要深入學(xué)習(xí)線程工具類,這個(gè)同步隊(duì)列就必須得掌握,這篇文章主要介紹了Java中的AQS同步隊(duì)列問題,需要的朋友可以參考下
    2022-06-06
  • SpringCloud中的Eureka注冊中心詳細(xì)解讀

    SpringCloud中的Eureka注冊中心詳細(xì)解讀

    這篇文章主要介紹了SpringCloud中的Eureka注冊中心詳細(xì)解讀,想要參與服務(wù)注冊發(fā)現(xiàn)的實(shí)例首先需要向Eureka服務(wù)器注冊信息,注冊在第一次心跳發(fā)生時(shí)提交,需要的朋友可以參考下
    2023-11-11
  • Spring?Boot整合郵箱發(fā)送郵件實(shí)例

    Spring?Boot整合郵箱發(fā)送郵件實(shí)例

    大家好,本篇文章主要講的是Spring?Boot整合郵箱發(fā)送郵件實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Java中String、StringBuffer、StringBuilder的區(qū)別詳解

    Java中String、StringBuffer、StringBuilder的區(qū)別詳解

    java中String、StringBuffer、StringBuilder是編程中經(jīng)常使用的字符串類,他們之間有什么區(qū)別呢?下面小編給大家總結(jié)了Java中String、StringBuffer、StringBuilder的區(qū)別詳解,需要的朋友參考下吧
    2016-06-06
  • 深入了解Java方法的重載與重寫

    深入了解Java方法的重載與重寫

    在最初學(xué)習(xí)java的時(shí)候,人們都知道,java這種面向?qū)ο蟮恼Z言,一共有三大特征,分別是:封裝、繼承、多態(tài)。多態(tài)的實(shí)現(xiàn)途徑有三種:重寫、重載、接口實(shí)現(xiàn)。本文就來為大家詳細(xì)講講Java方法的重載與重寫
    2022-07-07
  • Java程序去調(diào)用并執(zhí)行shell腳本及問題總結(jié)(推薦)

    Java程序去調(diào)用并執(zhí)行shell腳本及問題總結(jié)(推薦)

    這篇文章主要介紹了Java程序去調(diào)用并執(zhí)行shell腳本及問題總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論

上高县| 乌审旗| 绩溪县| 黔南| 尉氏县| 固阳县| 郧西县| 阿合奇县| 禹城市| 通州区| 临湘市| 郑州市| 邹城市| 桦甸市| 县级市| 台前县| 赤水市| 朔州市| 桐庐县| 封开县| 玛纳斯县| 德阳市| 登封市| 新丰县| 安塞县| 鄯善县| 江华| 凤城市| 辽阳市| 庆云县| 神农架林区| 遵义市| 娄底市| 和田市| 岳阳县| 大庆市| 卢湾区| 江山市| 手游| 新邵县| 徐州市|