多线程顺序调用

时光怂恿深爱的人放手 提交于 2020-03-03 07:26:05
package com.atguigu.bigdata.juc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author tianmin
 * @date 2020/3/2 0002
 * @notes 多个线程之间按顺序调用,实现A->B->C
 * 三个线程的启动要求如下:
 *  AA 打印5ci;BB打印10次;CC打印15次
 *  接着
 *  AA 打印5ci;BB打印10次;CC打印15次
 *  来10轮
 */
public class ConditionDemo {
    public static void main(String[] args) {
        // 创建资源类
        final ShareData shareData = new ShareData();

        // 创建A、B、C三个线程
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    shareData.print5();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "A").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    shareData.print10();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "B").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    shareData.print15();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "C").start();
    }
}



class ShareData{
    //标记位 1:A   2:B     3:C
    private int flg = 1;
    //可重入锁
    private Lock lock = new ReentrantLock();
    //条件
    Condition c1 = lock.newCondition();
    Condition c2 = lock.newCondition();
    Condition c3 = lock.newCondition();

    public void print5() throws InterruptedException {
        lock.lock();
        try {
            // 1 判断
            while(flg != 1){
                c1.await();
            }

            // 2 业务逻辑
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
            // 3 修改标志位
            flg = 2;

            // 通知B
            c2.signal();
        }finally {
            lock.unlock();
        }
    }

    public void print10() throws InterruptedException {
        lock.lock();
        try {
            // 1 判断
            while(flg != 2){
                c2.await();
            }

            // 2 业务逻辑
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
            // 3 修改标志位
            flg = 3;

            // 通知B
            c3.signal();
        }finally {
            lock.unlock();
        }
    }

    public void print15() throws InterruptedException {
        lock.lock();
        try {
            // 1 判断
            while(flg != 3){
                c3.await();
            }

            // 2 业务逻辑
            for (int i = 0; i < 15; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
            // 3 修改标志位
            flg = 1;

            // 通知B
            c1.signal();
        }finally {
            lock.unlock();
        }
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!