一、任务
启用三个线程,打印3轮;
线程一t1,每轮打印1次;
线程二t2,每轮打印2次;
线程三t3,每轮打印3次;
线程:t1,第1轮,第1次打印 线程:t2,第1轮,第1次打印 线程:t2,第1轮,第2次打印 线程:t3,第1轮,第1次打印 线程:t3,第1轮,第2次打印 线程:t3,第1轮,第3次打印 线程:t1,第2轮,第1次打印 线程:t2,第2轮,第1次打印 线程:t2,第2轮,第2次打印 线程:t3,第2轮,第1次打印 线程:t3,第2轮,第2次打印 线程:t3,第2轮,第3次打印 线程:t1,第3轮,第1次打印 线程:t2,第3轮,第1次打印 线程:t2,第3轮,第2次打印 线程:t3,第3轮,第1次打印 线程:t3,第3轮,第2次打印 线程:t3,第3轮,第3次打印
二、实现
1、定义资源类及打印方法
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Flag { int flag = 1; private final Lock lock = new ReentrantLock(); Condition c1 = lock.newCondition(); Condition c2 = lock.newCondition(); Condition c3 = lock.newCondition(); public void print1(int loop) { //加锁 lock.lock(); try { //判断条件 while (flag != 1) { c1.await(); } //执行任务 for (int i = 0; i < 1; i++) { System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1)); } //修改标志位 flag = 2; //通知 c2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { //解锁 lock.unlock(); } } public void print2(int loop) { //加锁 lock.lock(); try { //判断条件 while (flag != 2) { c2.await(); } //执行任务 for (int i = 0; i < 2; i++) { System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1)); } //修改标志位 flag = 3; //通知 c3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { //解锁 lock.unlock(); } } public void print3(int loop) { //加锁 lock.lock(); try { //判断条件 while (flag != 3) { c3.await(); } //执行任务 for (int i = 0; i <3; i++) { System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1)); } //修改标志位 flag = 1; //通知 c1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { //解锁 lock.unlock(); } } }
2、创建线程,执行任务
public static void main(String[] args) { Flag flag = new Flag(); new Thread(() -> { for (int i = 0; i < 3; i++) { flag.print1(i + 1); } }, "t1").start(); new Thread(() -> { for (int i = 0; i < 3; i++) { flag.print2(i + 1); } }, "t2").start(); new Thread(() -> { for (int i = 0; i < 3; i++) { flag.print3(i + 1); } }, "t3").start(); }