题目描述:
多线程之间按顺序调用,实现 A-> B -> C 三个线程启动,要求如下:
A打印3次,B打印5次,C打印7次
紧接着
A打印3次,B打印5次,C打印7次
…
来3轮
解决办法:ReentrantLock+Condition
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class shareData{
private int number=1;
private Lock lock=new ReentrantLock();
private Condition c1=lock.newCondition();
private Condition c2=lock.newCondition();
private Condition c3=lock.newCondition();
public void printA(){
lock.lock();
try {
while (number!=1){
c1.await();
}
for (int i=0;i<3;i++)
System.out.println(Thread.currentThread().getName()+"\t"+number+"\t"+i);
number=2;
c2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printB(){
lock.lock();
try {
while (number!=2)
c2.await();
for(int i=0;i<5;i++) {
System.out.println(Thread.currentThread().getName() + "\t" + number + "\t" + i);
}
number=3;
c3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printC(){
lock.lock();
try {
while (number!=3)
c3.await();
for(int i=0;i<7;i++) {
System.out.println(Thread.currentThread().getName() + "\t" + number + "\t" + i);
}
number=1;
c1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public class conditionDemon {
public static void main(String[] args) {
shareData share = new shareData();
new Thread(()->{
for(int i=0;i<3;i++)
share.printA();
},"A").start();
new Thread(()->{
for(int i=0;i<3;i++)
share.printB();
},"B").start();
new Thread(()->{
for(int i=0;i<3;i++)
share.printC();
},"C").start();
}
}
输出结果:
A 1 0
A 1 1
A 1 2
B 2 0
B 2 1
B 2 2
B 2 3
B 2 4
C 3 0
C 3 1
C 3 2
C 3 3
C 3 4
C 3 5
C 3 6
A 1 0
A 1 1
A 1 2
B 2 0
B 2 1
B 2 2
B 2 3
B 2 4
C 3 0
C 3 1
C 3 2
C 3 3
C 3 4
C 3 5
C 3 6
A 1 0
A 1 1
A 1 2
B 2 0
B 2 1
B 2 2
B 2 3
B 2 4
C 3 0
C 3 1
C 3 2
C 3 3
C 3 4
C 3 5
C 3 6
Process finished with exit code 0