Java實(shí)現(xiàn)線程按序交替執(zhí)行的方法詳解
一、題目描述
題目:有a、b、c三個(gè)線程,使得它們按照abc依次執(zhí)行10次。
二、解題思路
控制執(zhí)行線程變量flag,利用lock鎖來保證線程安全,使用comdition來堵塞線程和通信。
Condition:
condition接口描述了可能會(huì)與鎖有關(guān)的條件變量。這些用法上與使用object.wait訪問隱式監(jiān)視器類似,但提供了更強(qiáng)大的功能。需要特別指出的是,單個(gè)lock可能與多個(gè)Condition對(duì)象關(guān)聯(liá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)文章
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)接口冪等性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Java創(chuàng)建student類詳細(xì)代碼例子
這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建student類的相關(guān)資料,學(xué)生類(Student)是一種面向?qū)ο蟮木幊谈拍?其主要用于描述學(xué)生的屬性和行為,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
使用springboot不自動(dòng)初始化數(shù)據(jù)庫連接池
這篇文章主要介紹了使用springboot不自動(dòng)初始化數(shù)據(jù)庫連接池,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
java打包文件成zip、壓縮文件及file.mkdir和mkdirs的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于java打包文件成zip、壓縮文件及file.mkdir和mkdirs區(qū)別詳解的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
Java實(shí)現(xiàn)多個(gè)單張tif文件合并成一個(gè)多頁tif文件
業(yè)務(wù)部門需要將多個(gè)單張的tiff文件,合并成一個(gè)多頁的tiff文件,本文就來介紹一下如何實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09

