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),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無構(gòu)造參數(shù),重寫toString方式
這篇文章主要介紹了java之idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無構(gòu)造參數(shù),重寫toString方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11springboot結(jié)合mysql主從來實現(xiàn)讀寫分離的方法示例
這篇文章主要介紹了springboot結(jié)合mysql主從來實現(xiàn)讀寫分離的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04springboot?vue測試平臺開發(fā)調(diào)通前后端環(huán)境實現(xiàn)登錄
這篇文章主要介紹了springboot?vue測試平臺開發(fā)調(diào)通前后端環(huán)境實現(xiàn)登錄詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05