问题场景
- 让线程按照约定的顺序进行输入和输出
- A 线程打印 5 次 A,B 线程打印 10 次 B,C 线程打印 15 次 C,按照此顺序循环 10 轮
实现流程
通过: 在操作方法中添加标志位+ conditionA.signal(); 确定执行线程的顺序
流程代码
```java package com.atguigu.test; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;
public class DemoClass { / 通信对象:0—打印 A 1—-打印 B 2——打印 C / private int flag = 0; / 声明锁 / private Lock lock = new ReentrantLock(); / 声明钥匙 A / private Condition conditionA = lock.newCondition(); / 声明钥匙 B / private Condition conditionB = lock.newCondition(); / 声明钥匙 C / private Condition conditionC = lock.newCondition();
/*** A 打印 5 次*/public void printA( int j ) {try {lock.lock();while (flag != 0) {conditionA.await();}System.out.println(Thread.currentThread().getName() + "输出 A,第" + j + "轮开始");/* 输出 5 次 A */for (int i = 0; i < 5; i++) {System.out.println("A");}/* 开始打印 B */flag = 1;/* 唤醒 B */conditionB.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}/*** B 打印 10 次*/public void printB(int j){try {lock.lock();while ( flag != 1 ){conditionB.await();}System.out.println( Thread.currentThread().getName() + "输出 B,第" + j + "轮开始" );/* 输出 10 次 B */for ( int i = 0; i < 10; i++ ){System.out.println( "B" );}/* 开始打印 C */flag = 2;/* 唤醒 C */conditionC.signal();}catch ( Exception e ) {e.printStackTrace();} finally {lock.unlock();}}
/**
- C 打印 15 次
*/
} ```public void printC( int j ) { try { lock.lock(); while ( flag != 2 ) { conditionC.await(); } System.out.println( Thread.currentThread().getName() + "输出 C,第" + j + "轮开始" ); /* 输出 15 次 C */ for ( int i = 0; i < 15; i++ ) { System.out.println( "C" ); } System.out.println( "-----------------------------------------" ); /* 开始打印 A */ flag = 0; /* 唤醒 A */ conditionA.signal(); }catch ( Exception e ) { e.printStackTrace(); } finally { lock.unlock(); } }测试类
```java package com.atguigu.test;
/**
- volatile 关键字实现线程交替加减
/
public class TestVolatile {
/*
- 交替加减
- @param args
*/
public static void main( String[] args )
{
DemoClass demoClass = new DemoClass();
new Thread( () - > {
new Thread( () - > {for ( int i = 1; i <= 10; i++ ) { demoClass.printA( i ); } }, "A 线程" ).start();
new Thread( () - > {for ( int i = 1; i <= 10; i++ ) { demoClass.printB( i ); } }, "B 线程" ).start();
} } ```for ( int i = 1; i <= 10; i++ ) { demoClass.printC( i ); } }, "C 线程" ).start();注
通过flag和
