首页 > 其他分享 >使用conditional 实现线程精准通讯

使用conditional 实现线程精准通讯

时间:2023-11-25 23:00:10浏览次数:21  
标签:lock conditional number 线程 ex catch public 精准

实现3个线程之间依次执行

比如有3个线程A,B,C ,需要按照顺序执行,ABC,ABC 依次执行。

这个使用可以使用 Lock 的 conditional来实现线程之间精准通讯。

点击查看代码
package com.study.juc;

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

/**
 * 功能: TODO
 *
 * @author ASUS
 * @date 2023/11/25 22:40
 */
public class ConditionalDemo {

    public static void main(String[] args) {
        Data data=new Data();
        new Thread(()->{
            for(int i=0;i<10;i++){
                data.printA();
            }

        },"A").start();
        new Thread(()->{
            for(int i=0;i<10;i++){
                data.printB();
            }
        },"B").start();
        new Thread(()->{
            for(int i=0;i<10;i++){
                data.printC();
            }
        },"C").start();
    }


}

class Data{
    private Lock lock=new ReentrantLock();
    private Condition condition1=lock.newCondition();
    private Condition condition2=lock.newCondition();
    private Condition condition3=lock.newCondition();

    private int number=1;

    public void printA(){
        lock.lock();
        try {
            while (number!=1){
                condition1.await();
            }
            //业务代码
            System.err.println(Thread.currentThread().getName()+"->AAA");
            number=2;

            condition2.signal();
        }
        catch (Exception ex){
            ex.printStackTrace();
        }
        finally {
            lock.unlock();
        }
    }

    public void printB(){
        lock.lock();
        try {
            while (number!=2){
                condition2.await();
            }
            System.err.println(Thread.currentThread().getName()+"->BBB");
            number=3;

            condition3.signal();
        }
        catch (Exception ex){
            ex.printStackTrace();
        }
        finally {
            lock.unlock();
        }
    }

    public void printC(){
        lock.lock();
        try {
            while (number!=3){
                condition3.await();
            }
            System.err.println(Thread.currentThread().getName()+"->CCC");
            number=1;

            condition1.signal();
        }
        catch (Exception ex){
            ex.printStackTrace();
        }
        finally {
            lock.unlock();
        }
    }

}

标签:lock,conditional,number,线程,ex,catch,public,精准
From: https://www.cnblogs.com/yg_zhang/p/17856300.html

相关文章

  • 线程-同步工具类
    CountDownLatch(闭锁)1.CountDownLatch是一个同步的辅助类,允许一个或多个线程一直等待,直到其它线程完成它们的操作。2.它常用的API其实就两个:await()和countDown()。3.count初始化CountDownLatch,然后需要等待的线程调用await方法。await方法会一直受阻塞直到count=0。4.而其......
  • set集合的线程安全问题
    一、HashSetHashSet是基于HashMap实现的,因为HashMap本身是线程不安全的,所以HashMap就是线程不安全的,简单看下HashSet的源码publicclassHashSet<E>extendsAbstractSet<E>implementsSet<E>,Cloneable,java.io.Serializable{staticfinallongserialVersio......
  • list集合的线程安全问题分析
    一、ArrayList先说结论,ArrayList是线程不安全的。至于为什么需要去了解它的实现原理,来看下它的源码。首先ArrayList是基于数据实现的,分析它的线程安全问题需要看下add方法publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Clone......
  • 多线程编程之——终止(打断)正在执行中的线程
    多线程编程之——终止(打断)正在执行中的线程ps:文字有点多,想看结果的,直接跳转:《二》一、基础知识1、我们基于spring开发,把线程都交给spring把线程交给spring管理好不好?将线程交给Spring管理是一个常见的做法,特别是在基于Spring的应用程序中。通过将线程纳入Spring的管理......
  • winform 使用了invoke还是报错 线程间操作无效: 从不是创建控件“Form2”的线程访问它
    winform开发中,遇到“线程间操作无效:从不是创建控件“Form2”的线程访问它”,明明使用了网上说的this.invoke,怎么还是会报这个错误呢?代码如下,由于是测试configureAwait功能时发现的,所以带了它的一些使用 privateasyncvoidbutton7_Click(objectsender,EventArgse)//点......
  • 一个用于多线程共享数据保护测试的简易游戏服务器代码
    #include<iostream>#include<thread>#include<list>#include<mutex>//一个线程负责从客户端读取用户的命令,放入一个队列中;//另一个线程负责从队列中读取命令并解析,假设用一个int变量代表一个命令。classA{public://这里无法模拟从网络接受命令的过程,我们......
  • 线程-ThreadLocal篇
    ThreadLocal类(用于创建一个线程本地变量)在Thread中有一个成员变量ThreadLocals,该变量的类型是ThreadLocalMap,也就是一个Map,它的键是threadLocal,值就是变量的副本。通过ThreadLocal的get()方法可以获取该线程变量的本地副本,在get方法之前要先set,否则就要重写initialValue()方法......
  • Java21虚拟线程实践
    Java21虚拟线程实践一个月之前,java21正式版发布了,作为继java17之后的又一个长期支持版本(LTS),为我们带来了很多新的特性,其中我最感兴趣的就是虚拟线程(virtualthread),相信大家对虚拟线程也很好奇。趁着空闲时间安装了jdk21来体验一把,顺便把我查到的关于java21虚拟线程相关的资料......
  • 多线程
    多线程线程其实是程序中的一条执行路径我之前所以写的程序,其实都是单线程程序那么怎样的程序才是多线程程序呢?支持同时有很多人一起进入网站,并且每一个人的行为互不影响。例如百度网盘中,可以同时上传或者下载的多个文件,这些程序中其实就有多条执行路径,每一个执行路径就是一条......
  • C++11 多线程并发 互斥量、条件变量和信号量
    互斥量Classesmutex(C++11)providesbasicmutualexclusionfacility(class)timed_mutex(C++11)providesmutualexclusionfacilitywhichimplementslockingwithatimeout(class)recursive_mutex(C++11)providesmutualexclusionfacili......