Java實(shí)現(xiàn)線程按序交替執(zhí)行的方法詳解
一、題目描述
題目:有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
寫(xiě)三個(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)文章
SpringMVC?RESTFul實(shí)戰(zhàn)案例刪除功能實(shí)現(xiàn)
這篇文章主要為大家介紹了SpringMVC?RESTFul實(shí)戰(zhàn)案例刪除功能實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Springboot實(shí)現(xiàn)驗(yàn)證碼登錄
這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)驗(yàn)證碼登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
SpringBoot3集成Thymeleaf的過(guò)程詳解
在現(xiàn)代的Web開(kāi)發(fā)中,構(gòu)建靈活、動(dòng)態(tài)的用戶界面是至關(guān)重要的,Spring Boot和Thymeleaf的結(jié)合為開(kāi)發(fā)者提供了一種簡(jiǎn)單而強(qiáng)大的方式來(lái)創(chuàng)建動(dòng)態(tài)的Web應(yīng)用,本文將介紹如何在Spring Boot項(xiàng)目中集成Thymeleaf,并展示一些基本的使用方法,需要的朋友可以參考下2024-01-01
idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無(wú)構(gòu)造參數(shù),重寫(xiě)toString方式
這篇文章主要介紹了java之idea快捷鍵生成getter和setter,有構(gòu)造參數(shù),無(wú)構(gòu)造參數(shù),重寫(xiě)toString方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
springboot結(jié)合mysql主從來(lái)實(shí)現(xiàn)讀寫(xiě)分離的方法示例
這篇文章主要介紹了springboot結(jié)合mysql主從來(lái)實(shí)現(xiàn)讀寫(xiě)分離的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
springboot?vue測(cè)試平臺(tái)開(kāi)發(fā)調(diào)通前后端環(huán)境實(shí)現(xiàn)登錄
這篇文章主要介紹了springboot?vue測(cè)試平臺(tái)開(kāi)發(fā)調(diào)通前后端環(huán)境實(shí)現(xiàn)登錄詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
java實(shí)現(xiàn)實(shí)時(shí)通信聊天程序
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)實(shí)時(shí)通信聊天程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

