JAVA多线程使用Lock,Condition实现A,B,C,D依次执行,怎么实现排它,同步通讯

这篇文章主要介绍“JAVA多线程使用Lock,Condition实现A,B,C,D依次执行,怎么实现排它,同步通讯”,在日常操作中,相信很多人在JAVA多线程使用Lock,Condition实现A,B,C,D依次执行,怎么实现排它,同步通讯问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JAVA多线程使用Lock,Condition实现A,B,C,D依次执行,怎么实现排它,同步通讯”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

package com.study;

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


public class BlockingQueueDemo {
  public static void main(String[] args) {
    BlockingQueueDemo blockingQueueDemo = new BlockingQueueDemo();
    final BlockingQueueClass blockingQueueClass = blockingQueueDemo.new BlockingQueueClass();
    Thread thread = new Thread(new Runnable() {

      @Override
      public void run() {
        while (true) {
          blockingQueueClass.invokeA();
        }
      }
    });
    thread.start();

    Thread thread2 = new Thread(new Runnable() {

      @Override
      public void run() {
        while (true) {
          blockingQueueClass.invokeB();
        }
      }
    });
    thread2.start();
    
    Thread thread3 = new Thread(new Runnable() {

      @Override
      public void run() {
        while (true) {
          blockingQueueClass.invokeC();
        }
      }
    });
    thread3.start();
    
    Thread thread4 = new Thread(new Runnable() {

      @Override
      public void run() {
        while (true) {
          blockingQueueClass.invokeD();
        }
      }
    });
    thread4.start();
  }

  class BlockingQueueClass {
    Lock lock = new ReentrantLock();
    Condition conditionA = lock.newCondition();
    Condition conditionB = lock.newCondition();
    Condition conditionC = lock.newCondition();
    Condition conditionD = lock.newCondition();
    boolean syncA = true;
    boolean syncB = false;
    boolean syncC = false;
    boolean syncD = false;

    public void invokeA() {
      lock.lock();
      try {
        while (!syncA) {
          try {
            conditionA.await();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        syncA = false;
        syncB = true;
        System.out.println("invoke A....");
        conditionB.signal();
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        lock.unlock();
      }
    }
    
    public void invokeB() {
      lock.lock();
      try {
        while (!syncB) {
          try {
            conditionB.await();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        syncB = false;
        syncC = true;
        System.out.println("invoke B....");
        conditionC.signal();
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        lock.unlock();
      }
    }
    
    public void invokeC() {
      lock.lock();
      try {
        while (!syncC) {
          try {
            conditionC.await();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        syncC = false;
        syncD = true;
        System.out.println("invoke C....");
        conditionD.signal();
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        lock.unlock();
      }
    }
    public void invokeD() {
      lock.lock();
      try {
        while (!syncD) {
          try {
            conditionD.await();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        syncD = false;
        syncA = true;
        System.out.println("invoke D....");
        conditionA.signal();
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        lock.unlock();
      }
    }
  }
}

到此,关于“JAVA多线程使用Lock,Condition实现A,B,C,D依次执行,怎么实现排它,同步通讯”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!