欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、題目描述

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

二、解題思路

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

Condition:

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

在condition對象中:

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

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

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

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

內(nèi)部類定義一個屬性:線程啟動的順序標識flag

寫三個方法:

  • 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{

        /**
         * //線程啟動的順序標識
         **/
        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實現(xiàn)線程按序交替執(zhí)行的方法詳解的文章就介紹到這了,更多相關(guān)Java線程按序交替執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC?RESTFul實戰(zhàn)案例刪除功能實現(xiàn)

    SpringMVC?RESTFul實戰(zhàn)案例刪除功能實現(xiàn)

    這篇文章主要為大家介紹了SpringMVC?RESTFul實戰(zhàn)案例刪除功能實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • spring中的注入list集合

    spring中的注入list集合

    這篇文章主要介紹了spring中的注入list集合問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Springboot實現(xiàn)驗證碼登錄

    Springboot實現(xiàn)驗證碼登錄

    這篇文章主要為大家詳細介紹了Springboot實現(xiàn)驗證碼登錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • SpringBoot3集成Thymeleaf的過程詳解

    SpringBoot3集成Thymeleaf的過程詳解

    在現(xiàn)代的Web開發(fā)中,構(gòu)建靈活、動態(tài)的用戶界面是至關(guān)重要的,Spring Boot和Thymeleaf的結(jié)合為開發(fā)者提供了一種簡單而強大的方式來創(chuàng)建動態(tài)的Web應(yīng)用,本文將介紹如何在Spring Boot項目中集成Thymeleaf,并展示一些基本的使用方法,需要的朋友可以參考下
    2024-01-01
  • idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無構(gòu)造參數(shù),重寫toString方式

    idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無構(gòu)造參數(shù),重寫toString方式

    這篇文章主要介紹了java之idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無構(gòu)造參數(shù),重寫toString方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java線程變量ThreadLocal源碼分析

    Java線程變量ThreadLocal源碼分析

    ThreadLocal用來提供線程內(nèi)部的局部變量,不同的線程之間不會相互干擾,這種變量在多線程環(huán)境下訪問時能保證各個線程的變量相對獨立于其他線程內(nèi)的變量,在線程的生命周期內(nèi)起作用,可以減少同一個線程內(nèi)多個函數(shù)或組件之間一些公共變量傳遞的復(fù)雜度
    2022-08-08
  • RabbitMQ的基礎(chǔ)知識

    RabbitMQ的基礎(chǔ)知識

    本文詳細介紹了RabbitMQ的基礎(chǔ)知識,通過本文,我們可以了解到MQ工作原理、交換機等相關(guān)知識,有需要的朋友可以參考一下
    2021-08-08
  • springboot結(jié)合mysql主從來實現(xiàn)讀寫分離的方法示例

    springboot結(jié)合mysql主從來實現(xiàn)讀寫分離的方法示例

    這篇文章主要介紹了springboot結(jié)合mysql主從來實現(xiàn)讀寫分離的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • springboot?vue測試平臺開發(fā)調(diào)通前后端環(huán)境實現(xiàn)登錄

    springboot?vue測試平臺開發(fā)調(diào)通前后端環(huán)境實現(xiàn)登錄

    這篇文章主要介紹了springboot?vue測試平臺開發(fā)調(diào)通前后端環(huán)境實現(xiàn)登錄詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • java實現(xiàn)實時通信聊天程序

    java實現(xiàn)實時通信聊天程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)實時通信聊天程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論