3个线程 交替换打印--java锁

1 篇文章 0 订阅
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author juntech
 * @version ${version}
 * @date 2019/12/19 16:03
 * @ClassName 类名
 * @Descripe 描述
 */
public class TestABCAlternateDemo {
    public static void main(String[] args) {
        ABCAlterNate ad = new ABCAlterNate();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i < 20; i++) {
                    ad.loopA(i);
                }
            }
        }, "A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i < 20; i++) {
                    ad.loopB(i);
                }
            }
        }, "B").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i < 20; i++) {
                    ad.loopC(i);
                    System.out.println("----------------------------");
                }
            }
        }, "C").start();

    }
}

    class ABCAlterNate {
        private int num = 1; //正在执行的标志
        private Lock lock = new ReentrantLock();
        //开启3个condition通信
        private Condition conditionA = lock.newCondition();
        private Condition conditionB = lock.newCondition();
        private Condition conditionC = lock.newCondition();


        /**
         * @param totalLoop 循环次数
         */
        public void loopB(int totalLoop) {
            //加锁
            lock.lock();

            try {
                //1.判断
                if (num != 2) {
                    conditionB.await();
                }
                //2.循环打印
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
                }
                //3.唤醒
                num = 3;
                conditionC.signal();


            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }

        public void loopC(int totalLoop) {
            //加锁
            lock.lock();

            try {
                //1.判断
                if (num != 3) {
                    conditionC.await();
                }
                //2.循环打印
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
                }
                //3.唤醒
                num = 1;
                conditionA.signal();


            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }

        public void loopA(int totalLoop) {
            //加锁
            lock.lock();

            try {
                //1.判断
                if (num != 1) {
                    conditionA.await();
                }
                //2.循环打印
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
                }
                //3.唤醒
                num = 2;
                conditionB.signal();


            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }


点击运行:

A	0	1
A	1	1
A	2	1
A	3	1
A	4	1
B	0	1
B	1	1
B	2	1
B	3	1
B	4	1
C	0	1
C	1	1
C	2	1
C	3	1
C	4	1
C	5	1
C	6	1
C	7	1
C	8	1
C	9	1
C	10	1
C	11	1
C	12	1
C	13	1
C	14	1
C	15	1
C	16	1
C	17	1
C	18	1
C	19	1
----------------------------
A	0	2
A	1	2
A	2	2
A	3	2
A	4	2
B	0	2
B	1	2
B	2	2
B	3	2
B	4	2
C	0	2
C	1	2
C	2	2
C	3	2
C	4	2
C	5	2
C	6	2
C	7	2
C	8	2
C	9	2
C	10	2
C	11	2
C	12	2
C	13	2
C	14	2
C	15	2
C	16	2
C	17	2
C	18	2
C	19	2
----------------------------
A	0	3
A	1	3
A	2	3
A	3	3
A	4	3
B	0	3
B	1	3
B	2	3
B	3	3
B	4	3
C	0	3
C	1	3
C	2	3
C	3	3
C	4	3
C	5	3
C	6	3
C	7	3
C	8	3
C	9	3
C	10	3
C	11	3
C	12	3
C	13	3
C	14	3
C	15	3
C	16	3
C	17	3
C	18	3
C	19	3
----------------------------
A	0	4
A	1	4
A	2	4
A	3	4
A	4	4
B	0	4
B	1	4
B	2	4
B	3	4
B	4	4
C	0	4
C	1	4
C	2	4
C	3	4
C	4	4
C	5	4
C	6	4
C	7	4
C	8	4
C	9	4
C	10	4
C	11	4
C	12	4
C	13	4
C	14	4
C	15	4
C	16	4
C	17	4
C	18	4
C	19	4
----------------------------
A	0	5
A	1	5
A	2	5
A	3	5
A	4	5
B	0	5
B	1	5
B	2	5
B	3	5
B	4	5
C	0	5
C	1	5
C	2	5
C	3	5
C	4	5
C	5	5
C	6	5
C	7	5
C	8	5
C	9	5
C	10	5
C	11	5
C	12	5
C	13	5
C	14	5
C	15	5
C	16	5
C	17	5
C	18	5
C	19	5
----------------------------
A	0	6
A	1	6
A	2	6
A	3	6
A	4	6
B	0	6
B	1	6
B	2	6
B	3	6
B	4	6
C	0	6
C	1	6
C	2	6
C	3	6
C	4	6
C	5	6
C	6	6
C	7	6
C	8	6
C	9	6
C	10	6
C	11	6
C	12	6
C	13	6
C	14	6
C	15	6
C	16	6
C	17	6
C	18	6
C	19	6
----------------------------
.......
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值