一、任务
启用三个线程,打印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();
}
|