package com.atguigu.juc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadOrderAcess {
public static void main(String[] args) {
ShareResources shareResources = new ShareResources();
new Thread(()->{
for (int i = 1; i <=10 ; i++) {
shareResources.print5();
}
},"A").start();
new Thread(()->{
for (int i = 1; i <=10 ; i++) {
shareResources.print10();
}
},"B").start();
new Thread(()->{
for (int i = 1; i <=10 ; i++) {
shareResources.print15();
}
},"C").start();
}
}
/**
* @auther zzyy
* @create 2020-03-26 12:32
* 多线程之间按顺序调用,实现A->B->C
* 三个线程启动,要求如下:
*
* AA打印5次,BB打印10次,CC打印15次
* 接着
* AA打印5次,BB打印10次,CC打印15次
* ......三个线程来10轮
*
* 精确通知,按照顺序走
*
* 1 线程操作资源类
* 2 判断、干活、通知
* 3 while
* 4 标志位的映射和修改flag
*/
class ShareResources{//资源类
int flag=1;//1.A 2.B 3.C
Lock lock=new ReentrantLock();
Condition condition1=lock.newCondition();
Condition condition2=lock.newCondition();
Condition condition3=lock.newCondition();
public void print5(){
lock.lock();
try {
//判断
while (flag!=1){
condition1.await();
}
//干活
for (int i = 1; i <=5 ; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
//通知
flag=2;
condition2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print10(){
lock.lock();
try {
//判断
while (flag!=2){
condition2.await();
}
//干活
for (int i = 1; i <=10 ; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
//通知
flag=3;
condition3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print15(){
lock.lock();
try {
//判断
while (flag!=3){
condition3.await();
}
//干活
for (int i = 1; i <=15 ; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
//通知
flag=1;
condition1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
多线程之间按顺序调用
最新推荐文章于 2022-07-28 11:41:50 发布