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

Java實(shí)現(xiàn)線程按序交替執(zhí)行的方法詳解

 更新時(shí)間:2022年10月08日 10:57:02   作者:小虛竹and掘金  
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)線程按序交替執(zhí)行,文中的示例代碼講解詳細(xì),對(duì)我們了解線程有一定幫助,需要的可以參考一下

一、題目描述

題目:有a、b、c三個(gè)線程,使得它們按照abc依次執(zhí)行10次。

二、解題思路

控制執(zhí)行線程變量flag,利用lock鎖來(lái)保證線程安全,使用comdition來(lái)堵塞線程和通信。

Condition:

condition接口描述了可能會(huì)與鎖有關(guān)的條件變量。這些用法上與使用object.wait訪問(wèn)隱式監(jiān)視器類似,但提供了更強(qiáng)大的功能。需要特別指出的是,單個(gè)lock可能與多個(gè)Condition對(duì)象關(guān)聯(lián)。為了避免兼容性問(wèn)題,Condition方法的名稱與對(duì)應(yīng)的objec版本中的不同。

在condition對(duì)象中:

  • await方法//是等待;這時(shí)鎖會(huì)釋放
  • signalAll方法//通知,線程等待結(jié)束,往下執(zhí)行

Condition實(shí)例實(shí)質(zhì)上被綁定到一個(gè)鎖上。要為特定Lock實(shí)例獲得Condition實(shí)例,請(qǐng)使用其newCondition()方法。

創(chuàng)建一個(gè)類:AbcAlternateDemo1

創(chuàng)建一個(gè)內(nèi)部類:Alternate

內(nèi)部類定義一個(gè)屬性:線程啟動(dòng)的順序標(biāo)識(shí)flag

寫三個(gè)方法:

  • loopA():先上鎖,判斷flag是不是1,不是則等待conditionA.await(); 如果是則輸出,flag是2,通知線程往下執(zhí)行conditionA.signalAll()。
  • loopB():先上鎖,判斷flag是不是2,不是則等待conditionA.await(); 如果是則輸出,flag是3,通知線程往下執(zhí)行conditionA.signalAll()。
  • loopC():先上鎖,判斷flag是不是3,不是則等待conditionA.await(); 如果是則輸出,flag是1,通知線程往下執(zhí)行conditionA.signalAll()。

三、代碼詳解

AbcAlternateDemo1

package com.xiaoxuzhu;

/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改記錄:
 * 修改后版本	        修改人		修改日期			修改內(nèi)容
 * 2022/5/15.1	    xiaoxuzhu		2022/5/15		    Create
 * </pre>
 * @date 2022/5/15
 */
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改記錄:
 * 修改后版本	        修改人		修改日期			修改內(nèi)容
 * 2022/5/15.1	    xiaoxuzhu		2022/5/15		    Create
 * </pre>
 * @date 2022/5/15
 */
public class AbcAlternateDemo1 {

    public static void main(String[] args) {
        Alternate alternate = new Alternate();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    alternate.loopA(i);
                }
            }
        },"A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    alternate.loopB(i);
                }
            }
        },"B").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    alternate.loopC(i);
                }
            }
        },"C").start();
    }

    static class Alternate{

        /**
         * //線程啟動(dòng)的順序標(biāo)識(shí)
         **/
        private int flag = 1;

        private Lock lock = new ReentrantLock();

        private Condition conditionA = lock.newCondition();
        private Condition conditionB = lock.newCondition();
        private Condition conditionC = lock.newCondition();

        public void loopA(int loopNum){
            lock.lock();
            try {
                if(flag !=1){
                    conditionA.await();
                }
                for (int i = 1; i <= 1; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+"--"+loopNum+"--"+ i);
                }
                flag =2;
                conditionB.signalAll();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }

        public void loopB(int loopNum){
            lock.lock();
            try {
                if(flag !=2){
                    conditionB.await();
                }
                for (int i = 1; i <= 1; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+"--"+loopNum+"--"+ i);
                }
                flag =3;
                conditionC.signalAll();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }

        public void loopC(int loopNum){
            lock.lock();
            try {
                if(flag !=3){
                    conditionC.await();
                }
                for (int i = 1; i <= 1; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+"--"+loopNum+"--"+ i);
                }
                flag =1;
                System.out.println("----------------------");
                conditionA.signalAll();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }

    }
}

到此這篇關(guān)于Java實(shí)現(xiàn)線程按序交替執(zhí)行的方法詳解的文章就介紹到這了,更多相關(guān)Java線程按序交替執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis 自定義類型處理器示例詳解

    Mybatis 自定義類型處理器示例詳解

    在某些情況下我們需要對(duì)類型做處理,例如數(shù)據(jù)存儲(chǔ)的是Long,程序里是BigDecimal,那么我們出庫(kù)入庫(kù)都需要做處理,此時(shí)就可以使用類型處理器,本文通過(guò)示例給大家介紹Mybatis 自定義類型處理器的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Spring?Boot中application配置文件的生效順序及應(yīng)用范圍

    Spring?Boot中application配置文件的生效順序及應(yīng)用范圍

    Spring?Boot的一個(gè)重要特性就是它的自動(dòng)配置,這一特性在很大程度上依賴于名稱為application的配置文件,本文將詳細(xì)介紹在Spring?Boot中,這些配置文件的加載順序以及每份文件的應(yīng)用范圍,需要的朋友可以參考下
    2024-03-03
  • SpringBoot關(guān)于自定義注解實(shí)現(xiàn)接口冪等性方式

    SpringBoot關(guān)于自定義注解實(shí)現(xiàn)接口冪等性方式

    這篇文章主要介紹了SpringBoot關(guān)于自定義注解實(shí)現(xiàn)接口冪等性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java 如何從字符串里面提取時(shí)間

    java 如何從字符串里面提取時(shí)間

    這篇文章主要介紹了java實(shí)現(xiàn)從字符串里面提取時(shí)間的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java創(chuàng)建student類詳細(xì)代碼例子

    Java創(chuàng)建student類詳細(xì)代碼例子

    這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建student類的相關(guān)資料,學(xué)生類(Student)是一種面向?qū)ο蟮木幊谈拍?其主要用于描述學(xué)生的屬性和行為,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 使用springboot不自動(dòng)初始化數(shù)據(jù)庫(kù)連接池

    使用springboot不自動(dòng)初始化數(shù)據(jù)庫(kù)連接池

    這篇文章主要介紹了使用springboot不自動(dòng)初始化數(shù)據(jù)庫(kù)連接池,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java打包文件成zip、壓縮文件及file.mkdir和mkdirs的區(qū)別詳解

    java打包文件成zip、壓縮文件及file.mkdir和mkdirs的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于java打包文件成zip、壓縮文件及file.mkdir和mkdirs區(qū)別詳解的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • java?Collection集合接口的介紹和使用詳解

    java?Collection集合接口的介紹和使用詳解

    這篇文章主要為大家介紹了java?Collection集合接口的介紹和使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 深入了解Java中的反射機(jī)制(reflect)

    深入了解Java中的反射機(jī)制(reflect)

    Java的反射機(jī)制允許我們對(duì)一個(gè)類的加載、實(shí)例化、調(diào)用方法、操作屬性的時(shí)期改為在運(yùn)行期進(jìn)行,這大大提高了代碼的靈活度,本文就來(lái)簡(jiǎn)單講講反射機(jī)制的具體使用方法吧
    2023-05-05
  • Java實(shí)現(xiàn)多個(gè)單張tif文件合并成一個(gè)多頁(yè)tif文件

    Java實(shí)現(xiàn)多個(gè)單張tif文件合并成一個(gè)多頁(yè)tif文件

    業(yè)務(wù)部門需要將多個(gè)單張的tiff文件,合并成一個(gè)多頁(yè)的tiff文件,本文就來(lái)介紹一下如何實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評(píng)論

宁国市| 西吉县| 响水县| 姜堰市| 巴东县| 吐鲁番市| 车致| 区。| 故城县| 临洮县| 姜堰市| 铜梁县| 青海省| 丹东市| 资溪县| 宣恩县| 石棉县| 雷州市| 洛南县| 澳门| 板桥市| 辽源市| 应城市| 张家界市| 荆门市| 新蔡县| 南丹县| 绥芬河市| 新安县| 古田县| 闽清县| 临洮县| 汉沽区| 惠水县| 兴仁县| 高淳县| 翼城县| 改则县| 清流县| 临城县| 堆龙德庆县|