java多线程初探(零)使用Lock-线程间通信

Java多线程之间的通信 在 Java 多线程编程中,​​线程通信​​是指多个线程之间通过某种机制进行数据交换或协调执行顺序,以确保线程间能够正确、高效地协作完成任务。由于线程是并发执行的独立个体,默认情况下它们之间是相互隔离的,但实际业务中常常需要线程间共享数据或同步操作(如生产者-消费者模型),这时就需要借助Java提供的通信机制来实现线程间的交互。 阅读详情

测试类

package gcc.thread.Lock.condition;

/**
 * 类似wait和notify,ReentrantLock使用Condition来控制等待和唤醒机制,并且可以根据分组唤醒指定的线程,选择性通知
 * 如下,线程aa和ab在等待时所属不同的Condition,通过condition_A只唤醒了aa的等待
 */
public class Test {

    public static void main(String[] args) {
        try {
            ConditionService c = new ConditionService();
            ThreadA a = new ThreadA(c);
            ThreadB b = new ThreadB(c);
            a.start();
            Thread.sleep(1000);
            b.start();
            //
            ThreadA_a aa = new ThreadA_a(c);
            ThreadA_b ab = new ThreadA_b(c);
            aa.start();
            ab.start();
            Thread.sleep(1000);
            c.signalAll_A();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    
}

服务方法

package gcc.thread.Lock.condition;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

public class ConditionService {

    protected static Logger logger = LoggerFactory.getLogger(ConditionService.class);

    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    private Condition condition_A = lock.newCondition();
    private Condition condition_B = lock.newCondition();

    public void await(){
        try {
            lock.lock();
            logger.info("开始等待时间:"+System.currentTimeMillis());
            condition.await();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void awaitA(){
        try {
            lock.lock();
            logger.info("condition_A开始等待时间:"+System.currentTimeMillis());
            condition_A.await();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void awaitB(){
        try {
            lock.lock();
            logger.info("condition_B开始等待时间:"+System.currentTimeMillis());
            condition_B.await();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void signal(){
        try {
            lock.lock();
            condition.signal();
            logger.info("唤醒时间:"+System.currentTimeMillis());
        } finally {
            lock.unlock();
        }
    }

    public void signalAll_A(){
        try {
            lock.lock();
            condition_A.signalAll();
            logger.info("condition_A唤醒时间:"+System.currentTimeMillis());
        } finally {
            lock.unlock();
        }
    }

    public void signalAll_B(){
        try {
            lock.lock();
            condition_B.signalAll();
            logger.info("condition_B唤醒时间:"+System.currentTimeMillis());
        } finally {
            lock.unlock();
        }
    }

}

线程A

package gcc.thread.Lock.condition;

public class ThreadA extends Thread {
    ConditionService conditionService;
    public ThreadA(ConditionService conditionService){
        this.conditionService=conditionService;
    }

    @Override
    public void run() {
        conditionService.await();
    }
}

线程B

package gcc.thread.Lock.condition;

public class ThreadB extends Thread {
    ConditionService conditionService;
    public ThreadB(ConditionService conditionService){
        this.conditionService=conditionService;
    }

    @Override
    public void run() {
        conditionService.signal();
    }
}

线程Aa

package gcc.thread.Lock.condition;

public class ThreadA_a extends Thread {
    ConditionService conditionService;
    public ThreadA_a(ConditionService conditionService){
        this.conditionService=conditionService;
    }

    @Override
    public void run() {
        conditionService.awaitA();
    }
}

线程Ab

package gcc.thread.Lock.condition;

public class ThreadA_b extends Thread {
    ConditionService conditionService;
    public ThreadA_b(ConditionService conditionService){
        this.conditionService=conditionService;
    }

    @Override
    public void run() {
        conditionService.awaitB();
    }
}

 

java多线程核心技术梳理(附源码) 本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组。 阅读详情

相关推荐

Java多线程:线程间通信方式

这三个方法都是Condition接口中的方法,该接口是在Java 1.5中出现的,它用来替代传统的wait+notify实现线程间的协作,它的使用依赖于 Lock。反之,当一个线程被wait后,就会进入阻塞队列,等待被唤醒。案例步骤:通信是在不同线程间的通信,一个线程处于wait状态阻塞等待被唤醒,另一个线程通过notify或者notifyAll唤醒,当前的唤醒操作必须是作用与同一个对象,注意在进行唤醒和阻塞时必须要加锁的,加锁需要使用synchronized关键字。程序没有结束,他会一直读取阻塞队列。

流楚丶格念的博客 2629

Java中的多线程(线程间通信)

线程间通信: /学习笔记/ 多个线程在处理同一资源,但是任务却不同。 先看一个例子,采用两个线程执行进行输入和输出任务: //资源 class Resource { String name; String sex; } //输入 class Input implements Runnable { Resource r ; // Object o...

不思量 2万+

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信

前几篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用在《Java多线程编程-(4)-线程间通信机制的介绍与使用》已经学习了,可以使用方法wait/notify 结合同步关键字s

徐刘根的博客 8340

IEEE Transactions on Industrial Informatics(TII)投稿全流程解析:从准备到成功提交

本文详细解析了向IEEE Transactions on Industrial Informatics(TII)投稿的全流程,涵盖从投稿前的格式准备、内容结构优化到在线提交系统实操等关键环节。重点强调了遵守TII严格的格式规范、双盲评审要求以及如何构建有说服力的学术叙述,旨在帮助研究者提升稿件质量,顺利通过评审。

weixin_28396629的博客 1864

如何使用安路TD与Modelsim进行联合仿真?

1)安装安路FPGA开发软件;(本次实验使用版本:TD_5.6.3_Release)2)安装Modelsim仿真软件;(本次实验使用版本:Modelsim SE-64 10.1c)3)FPGA开发板;(本次实验使用型号:EG4X20BG256)4)LED点灯例程;

qq_17313923的博客 3216

java多线程与线程间通信

本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程的众多常见重要知识点,学习后会对java多线程概念及线程间通信方式有直观清晰的了解和掌握,可以编写并分析简单的多线程程序。 进程与线程 进程:是一个正在执行的程序。 每一个进程执行都有执行顺序,一个执行顺序是一个执行路径,或者叫控制单元; 每一个程序启动时,都会在内存中分配一片空间,进程就用于标识这片空间,并

jerrying0203的专栏 1万+

基于MacOS本地部署OpenClaw+Ollama技术要点

本文基于MacOS系统下本地部署OpenClaw+Ollama的实操经验,梳理部署全流程中的核心技术要点、环境配置规范、故障排查方法及落地优化方案,聚焦“本地AI模型联动OpenClaw技能调度”的核心需求,为同类本地部署场景提供可复用的技术参考,规避常见部署风险,确保系统稳定运行。

在科技赋能新时代,共同探索基础理论和宇宙未知。 5164

【Java多线程】3——Lock API控制多线程

在实际场景中,读操作不会改变数据,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。针对这种场景,Java 的并发包提供了读写锁,它表示两个锁,一个是读操作相关的锁,称为读锁,这是一种共享锁;一个是写相关的锁,称为写锁,这是一种排他锁,也叫独占锁、互斥锁。

一棵灬大树的博客 1106

RTX 50系显卡(5080/5090D)CUDA 12.8环境下的vLLM部署避坑与实战指南

本文为RTX 5080/5090D显卡用户提供了在CUDA 12.8环境下部署vLLM的完整实战指南。文章详细介绍了从驱动安装、CUDA 12.8环境配置、PyTorch Nightly版本精准匹配,到vLLM源码编译及常见报错排查的全过程,帮助开发者高效利用新一代硬件进行大模型推理。

gray5的博客 667

cadence virtuoso 激励信号源

vpulse,vpwl,vsin,vsource信号源介绍

努力学习的IC小白 3万+

Java——多线程高并发系列之线程间的通信(synchronized、Lock、Condition)

Java——多线程高并发系列之线程间的通信(synchronized、Lock、Condition)

贝尔摩德苦艾酒 7298

YOLO创新点改进点的消融实验设计规范

YOLO改进的消融实验是一种重要的方法,用于评估和验证模型中不同组件的影响。在进行YOLO改进的消融实验时,我们可以选择一些可能的改进点,比如Backbone网络、Anchor框设计和损失函数设计,然后通过实验来分析它们对模型性能的影响。首先,我们需要确定实验设计。对于每个改进点,我们将设计多个实验组,并针对每个实验组训练模型并进行性能评估。这里以三个改进点为例进行说明:改进点1:Backbone网络 (改进点2:Anchor框设计 (改进点3:损失函数设计 (

crasher123的博客 2909

深入理解(15)java多线程之Lock对象实现同步以及线程间通信

Lock对象简介 这里为什么说Lock对象哪?Lock其实是一个接口,在JDK1.5以后开始提供,其实现类常用的有ReentrantLock,这里所说的Lock对象即是只Lock接口的实现类,为了方便记忆或理解,都简称为Lock对象。 我们知道synchronized关键字可以实现线程间的同步互斥,从JDK1.5开始新增的ReentrantLock类能够达到同样的效果,并且在此基础上还扩展了很多实...

cowbin2012的专栏 1万+

【100%通过率】华为od机试C卷【小朋友来自多少小区】JS 实现

幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个.我们将这些数量汇总到数组 garden 中。请根据这些小朋友给出的信息,计算班级小朋友至少来自几个小区?

MISAYAONE的博客 2007

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

27.Java 线程间通信(synchronized 实现线程间通信、Lock 实现线程间通信)

27.Java 线程间通信(synchronized 实现线程间通信、Lock 实现线程间通信)

weixin_52173250的博客 613

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java线程-Lock锁-线程间通信-线程池

文章目录1.线程的Lock锁的使用2.死锁问题3.线程间通信--等待唤醒机制1.最基本的版本,只有一个数据2.改进版本,给出了不同的数据,并加入了同步机制3-2.等待唤醒机制3.等待唤醒机制改进该程序,让数据能够实现依次的出现4.等待唤醒机制的代码优化。把数据及操作都写在了资源类中3-3.线程的状态转换4.线程组5.线程池5-1.线程的第三种方式:实现Callable接口5-2.线程求和案例6.匿...

weixin_43317099的博客 742

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java 多线程解析:线程间的安全问题、线程间的通信问题与线程间的礼让问题

在 Java 编程领域,多线程是一个极为重要的概念,它能够显著提升程序的性能和响应能力,使程序能够更加高效地处理并发任务。本文将深入探讨 Java 中创建多线程的四种方式,以及多线程编程中的一些关键知识点,包括线程与进程的区别、线程安全问题、线程间通信、集合的线程安全性以及线程池的使用等。

天冬忘忧的博客 894

java多线程间的通信传值_Java多线程之线程间的通信

1. 线程间的通信线程间通信生产者+消费者通知等待唤醒机制多线程编程模板判断 干活 通知判断需使用while,以防止中断和虚假唤醒(见java.lang.Object的API)A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup. Wh...

weixin_42236063的博客 185

三、线程间通信

本文介绍了Java多线程通信的核心机制。主要内容包括:1)生产者-消费者模型的基础实现,使用synchronized的wait/notify机制;2)解决虚假唤醒问题,将if判断改为while循环;3)Lock与Condition的对应实现,展示更精细的线程控制;4)定制化通信案例,实现线程顺序执行(AA→BB→CC)和数字字母交替打印。关键点在于:资源类高内聚、判断-干活-通知的编程模板、防止虚假唤醒的while循环,以及Lock+Condition的精准线程唤醒机制。

m0_53091554的博客 1237

juc包:使用 juc 包下的显式 Lock 实现线程间通信

一、前置 线程间通信三要素: 多线程+判断+操作+通知+资源类。 上面的五个要素,其他三个要素就是普通的多线程程序问题,那么通信就需要线程间的互相通知,往往伴随着何时通信的判断逻辑。 在 java 的 Object 类里就提供了对应的方法来进行通知,同样的,保证安全的判断采用隐式的对象锁,也就是 synchronized 关键字实现。这块内容在: java多线程:线程间通信——生产者消费者模型 已经写过。 二、使用 Lock 实现线程间通信 那么,我们知道 juc 包里提供了显式的锁,即 Lock 接口的各

LifeGoesOn 251

实现Java多线程中的线程间通信

实现Java多线程中的线程间通信 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 线程间通信的基本概念 在线程编程中,线程间通信是指多个线程之间通过共享内存或消息传递的方式进行交互和协作。Java提供了多种机制来实现线程间通信,如共享对象、wait/notify机制、管道、并发集合等。...

weixin_40742266的博客 110

《Java多线程编程核心技术》——多线程总结

第1章 Java多线程技能 本章主要介绍线程和进程的相关概念,多线程的实现和停止,以及Thread类中的核心方法,具体实现的代码可以参考《Java多线程编程核心技术》。 进程和线程 1.进程 一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位。简单的说,进程就是一个程序的一次执行过程。 2.引入线程的动机和思路 操作系统采用进程机制使得多任务...

weixin_39754631的博客 4185

Java 多线程、线程安全、线程间通信

创建线程 Java使用 java.lang.Thread 类代表线程,所有的线程对象都必须是Thread类或其子类的实例。 Thread类 public class MyThread extends Thread{ public MyThread(String name) { //调用父类的String参数的构造方法,指定线程的名称 super(name);...

IT_10的博客 711

java多线程同步以及线程间通信

1. 线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: package com.test; /** * @decrition 模拟卖票线程 */ public class Ticket implements Runnable { //当前拥有的票数 private int num = 100; public void run() { while(true) { if(num>0) { try{ Thread.

cyh173356813的博客 1330
上一篇: java多线程初探(零)生产者消费者模式-线程通信
下一篇: 正则表达式入门
gcc_front
博客等级 码龄9年 16粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值