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

发布时间:2021-06-23 09:18:24 作者:chen
来源:亿速云 阅读:110

这篇文章主要介绍“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依次执行,怎么实现排它,同步通讯”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. JAVA多线程按指定顺序执行线程 Condition应用
  2. Java多线程怎么实现按指定顺序同步执行

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:RocketMQ mac安装教程

下一篇:用JAVA多线程实现子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》