juc控制线程轮询输出

大家推荐个靠谱的公众号程序员探索之路,大家一起加油,这个公众号已经接入图灵《juc控制线程轮询输出》 ​   

package com.zzh;

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

public class TestLoop {
   /**
    * 目的 a,b,c三个线程轮询输出A,B,C
    * 思路:
    * 用num标记是A,B,C
    * 方法里判断如果是自己就打印并且把标记更新成下一个
    * 如果不是自己就等待
    */
   public static void main(String[] args) {
      final Loop loop = new Loop();
      new Thread(new Runnable() {
         @Override
         public void run() {
            //打印10轮
            for (int i = 1;i <= 10;i++){
               loop.loopA(i);
            }
         }
      },"A").start();

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

      new Thread(new Runnable() {
         @Override
         public void run() {
            for (int i = 1;i <= 10;i++){
               loop.loopC(i);
            }
         }
      },"C").start();
   }
}

class Loop{
   private int num = 1;
   private Lock lock = new ReentrantLock();
   private Condition condition1 = lock.newCondition();
   private Condition condition2 = lock.newCondition();
   private Condition condition3 = lock.newCondition();
   public void loopA(int totalLoop){
      lock.lock();
      try {
         //如果轮不到自己打印就
         if (num != 1){
            condition1.await();
         }
         //输出
         System.out.println(Thread.currentThread().getName()+"---轮次"+totalLoop);
         //唤醒b
         num = 2;
         condition2.signal();
      }catch (Exception e){

      }finally {
         lock.unlock();
      }
   }
   public void loopB(int totalLoop){
      lock.lock();
      try {
         if (num != 2){
            condition2.await();
         }
         System.out.println(Thread.currentThread().getName()+"---轮次"+totalLoop);
         //唤醒c
         num = 3;
         condition3.signal();
      }catch (Exception e){

      }finally {
         lock.unlock();
      }
   }
   public void loopC(int totalLoop){
      lock.lock();
      try {
         if (num != 3){
            condition3.await();
         }
         System.out.println(Thread.currentThread().getName()+"---轮次"+totalLoop);
         //唤醒A
         num = 1;
         condition1.signal();
      }catch (Exception e){

      }finally {
         lock.unlock();
      }
   }
}
    原文作者:JUC
    原文地址: https://blog.csdn.net/yueloveme/article/details/85040820
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞