问题场景
- 让线程按照约定的顺序进行输入和输出
- 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和