Java基础知识(十二)--多线程通信

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

微信公众号:Java患者
专注Java领域技术分享

两个线程间的通信

什么时候需要通信

  • 多个线程并发执行时,在默认情况下CPU是随机切换线程的

  • 如果我们希望他们有规律的执行.就可以使用通信,例如每个线程执行一次打印

怎么通信

  • 如果希望线程等待,就调用wait()

  • 如果希望唤醒等待的线程,就调用notify()

  • 这两个方法必须在同步代码中执行,并且使用同步锁对象来调用

三个或者三个以上间的线程通信

  • notify()是随机唤醒一个线程

  • notifyAll()方法是唤醒所有线程

  • jdk5之前无法唤醒指定的一个线程

  • 如果多个线程之间通信,需要使用notifyAll()通知所有线程,用while来反复判断条件

同步

  • 使用ReentrantLock类的lock()和unlock方法进行同步

通信

  • 使用ReentrantLock类的newCondition()方法可以获取Condition对象

  • 需要等待的时候使用Condition的await()方法,唤醒的时候用signal()方法

  • 不同的线程使用不同的Condition,这样就能区分唤醒的时候找哪个线程了

线程组

  • 概述

    MyRunnable mr = new MyRunnable();
    Thread t1 = new Thread(mr, "张三");
    Thread t2 = new Thread(mr, "李四");
    //获取线程组
    // 线程类里面的方法:public final ThreadGroup getThreadGroup()
    ThreadGroup tg1 = t1.getThreadGroup();
    ThreadGroup tg2 = t2.getThreadGroup();
    // 线程组里面的方法:public final String getName()
    String name1 = tg1.getName();
    String name2 = tg2.getName();
    System.out.println(name1);
    System.out.println(name2);
    // 通过结果我们知道了:线程默认情况下属于main线程组
    // 通过下面的测试,你应该能够看到,默任情况下,所有的线程都属于同一个组
    System.out.println(Thread.currentThread().getThreadGroup().getName());
    // ThreadGroup(String name)
    ThreadGroup tg = new ThreadGroup("这是一个新的组");
    
    MyRunnable mr = new MyRunnable();
    // Thread(ThreadGroup group, Runnable target, String name)
    Thread t1 = new Thread(tg, mr, "张三");
    Thread t2 = new Thread(tg, mr, "李四");
    
    System.out.println(t1.getThreadGroup().getName());
    System.out.println(t2.getThreadGroup().getName());
    
    //通过组名称设置后台线程,表示该组的线程都是后台线程
    tg.setDaemon(true);
    • 自己设定线程组

    • 线程组的使用,默认是主线程组

    • ThreadGroup(String name) 创建线程组对象并给其赋值名字

    • 创建线程对象

    • Thread(ThreadGroup group, Runnable target, String name)

    • 设置整组的优先级或者守护线程

    • public final ThreadGroup getThreadGroup() 通过线程对象获取他所属于的组

    • public final String getName() 通过线程组对象获取他组的名字

    • Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,java允许程序直接对线程组进行控制

    • 默认情况下,所有的线程都属于主线程组

    • 我们也可以给线程设置分组

    • 演示

资料 · 福利

回复 【Java】即可获取最新零基础Java视频资料

回复 【激活】即可获取IDEA、datagrip等系统激活方式

回复 【面试题】即可获取Java技术相关面试题

往期 · 精彩

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

d625c0f110df68f4945f46af0a57af01.png

99432dbf76076215aeed9784dde9e873.jpeg

Java多线程编程详解 Java 的多线程编程为开发高效并发程序提供了强大的支持。从线程的创建、生命周期管理,到线程同步与通信,再到线程池的使用,每个环节都有相应的工具和方法。掌握这些知识不仅能提高程序的执行效率,还能有效地解决复杂的并发问题。希望这篇文章能帮助你更好地理解 Java 多线程编程。如果有任何问题或进一步的讨论,欢迎随时交流。本文已收录于,我的技术网站,有大厂完整面经,工作技术,架构师成长之路,等经验分享。 阅读详情

相关推荐

JAVA多线程之线程间的通信方式

一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码。 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信。 参考示例: 由于线程A和线程B持有同一个MyObject类的对象object,尽管这两个线程需要调用不同的方法,但是它...

KHOST的博客 1303

Java 多线程中的通信机制

隐式锁:避免了手动加锁和释放锁。可重入锁:避免了死锁。简单易用:实现起来较为简单方便。不够灵活:加锁粒度过大。效率过低:相较于显示锁,synchronized 效率过低。不可中断:其他处于 BLOCKED 状态中的线程必须要等待锁的释放才可以被中断。

2401_82656016的博客 1467

通信编程之java socket【二】-持续通信和多线程通信

上一节讲到java socket的服务端和客户端的简单通信,了解到socket的通信机制,详见:通信编程之java socket初探 今天我们继续深入一下,之前的例子有一个问题,就是只能发送一次消息就结束了,我们知道微信、QQ都是持续的收发消息的,那我们怎么才能使客户端持续的发送消息呢?下面我们就来实战探讨下。 一、java socket怎么持续通信 socket的服务端是阻塞式的通信的,通过accept()方法来阻塞,等待客户端的连接,连接后客户端发送消息,通过IO来收发消息。从这个流程上来看,我们

m0_66123161的博客 1827

Java多线程基础知识总结

<-----------------------------------------廖雪峰学Java-----------------------------------------> 目录1. 多线程基础知识2. 创建多线程3. 线程状态4. 中断线程5. 守护线程6. 线程同步7. 同步方法8. 死锁9. 使用wait和notify10. 使用ReentrantLock11. 使用Condition12. 使用ReadWriteLock13. 使用StampedLock14. 使用Concu

Pinkgranite86的博客 2721

【Java篇】多线程详解

Java系统在语言层次上对多线程直接提供支持,多线程的主要目的是将一个程序中的各个程序段并发化,在在通常情况下,Java程序各部分是按顺序一次执行的,由于某种原因,需要将这些按顺序执行的程序段转化为并发执行,每个程序段在逻辑上是相互完整的代码段。实际上,在单处理器上,同一时刻只能执行一个代码,但是在同一时间段内,这些代码交替执行,所谓的“微观串行,宏观并行”。...

zhangxia_的博客 1万+

Java入门-第十二篇 多线程的同步与通信

在多线程编程中,当多个线程同时访问共享资源时,可能会引发一系列问题。为了确保程序的正确性和稳定性,我们需要使用线程同步机制来协调线程间的操作,并且通过线程间通信机制让线程之间能够有效地协作。

无 1122

【JAVA-Day80】多线程通信

在 Java 开发中,多线程通信是一项至关重要的技术。通过多线程通信,不同的线程可以有效地交换信息和协调任务,从而提高程序的效率和性能。本篇博客将深入探讨多线程通信的概念、实现方法、应用场景以及常见面试题,帮助读者更好地理解和应用多线程编程。多线程是指在同一时间内,多个线程同时执行不同的任务。相比于单线程程序,多线程程序能够更充分地利用 CPU 资源,提高程序的并发性和响应性。在 Java 中,可以通过Thread类或者实现Runnable接口来创建和管理线程。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2万+

Java多线程Socket通信实战

本文还有配套的精品资源,点击获取 简介:小型socketDemo是一个使用Java Swing构建的图形用户界面应用程序,用于展示客户端与服务器间的Socket通信。通过使用Java的Socket类和ServerSocket类,该示例演示了多线程环境下处理多个客户端连接的能力。同时,它还解释了Socket通信的基本原理,包括服务器监听、客户端连接请求的处理,以及数据交换的机...

weixin_42400643的博客 1751

Java多线程间的通信

Java多线程间的通信   Java还提供了一种线程间通信的机制,这种通信通什么实现? wait,notify等机制   或使用pipeInputStream和pipeOutputStream    1. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种: 1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没

it_man的专栏 2万+

Minecraft Forge模组开发入门:从环境搭建到事件监听实战

事件驱动编程是一种基于事件和事件监听器的软件架构模式,其核心原理是通过事件总线实现组件间的松耦合通信。在游戏开发领域,这种模式能够有效处理玩家交互、状态变更等异步操作,具有高度的灵活性和可扩展性。Java作为面向对象编程语言,通过注解和反射机制为事件驱动提供了天然支持。Minecraft模组开发正是事件驱动编程的典型应用场景,开发者可以利用Forge框架提供的事件总线监听游戏内各种行为。本文以Minecraft Forge模组开发为例,详细讲解如何通过Gradle构建工具搭建开发环境,并实现自定义方块注册和

culi3182的博客 395

使用网分对晶体ESR/L1/C1/C0进行测量计算

Use R&amp;S Vector Network Analyzer test XTAL ESR/L1/C1/C0 測量方法:使用儀器的Port1端口,測量XTAL的S11,通過諧振的參數計算出ESR/L1/C1/C0的值。 實際晶體的等效模型:通常方便晶體分析,使用下圖(b)的等效模型,但實際測量發現晶體存在多個串聯諧振點,實際等效模型更接近(c)。 儀器測量到的S11,其中M...

qq_39138630的博客 2081

【Java】详解多线程通信

本文主要讲解了多线程的由来、成员方法、案例讲解及注意事项。

2301_80760873的博客 1004

字节开源 DeerFlow 2.0:从 Deep Research 到 Super Agent Harness 的进化之路

GitHub Trending 冠军项目,字节跳动完全开源的超级智能体框架。支持子代理、沙箱执行、长期记忆、技能扩展,可完成从几分钟到几小时的复杂任务。本文深度解析架构设计、安装实战、技能系统,并附上独家配置指南。

qq_38610923的博客 1708

Java多线程及通信方式详解

在讨论这个问题之前,首先要知道什么是Java多线程,我们拿个生活中的例子来说,例如在手机上使用软件,你可以同时运行多个应用程序或功能。你可以同时打开浏览器、音乐播放器和社交媒体应用。每个应用程序都在后台独立运行,就像多线程能够同时执行多个任务一样。但是有时候你需要等待某些操作完成才能继续进行。比如当你在等待一个应用加载数据时,你可以同时切换到另一个应用。但是直到数据加载完成,你才能够进行下一步操作。这种等待和切换类似于多线程中的线程间同步和等待操作。

EverythingAtOnce的博客 1789

避坑指南:SAP STO订单里‘发货存储地点’栏位不显示?检查这个关键配置

本文深入解析SAP STO订单中‘发货存储地点’栏位缺失问题的根本原因及解决方案。通过激活库存地点间转储功能、维护库存地点主数据等关键配置步骤,帮助用户快速恢复业务操作。特别适用于MM模块实施顾问和SAP系统管理员处理UB STO相关技术问题。

weixin_30632089的博客 97

四款办公Agent实测对比:WorkBuddy、千问办公、库库AI、豆包工作怎么选

AI Agent是一种能感知环境、自主决策并执行动作的智能系统,其核心在于工具调用、状态管理与错误恢复构成的执行闭环。在办公场景中,任务边界清晰、容错率高、重复性强,使Agent成为最容易落地的方向。通过调用本地文件、脚本或办公套件,Agent能自动完成文件批量处理、文档摘要、会议纪要等重复劳动,显著提升工作效率。目前WorkBuddy、千问办公、库库AI、豆包工作等产品分别从本地操作、办公套件嵌入、知识处理、轻量助手等路线切入,用户可根据自身场景选择。

weixin_29052717的博客 518

多线程(十二)线程是如何通信的?

什么是线程之前的通信? 多线程之前的通信,其实就是多个线程在操作同一个资源,但是操作动作不同 如图所示 多线程之间通讯需求 需求如下:第一个线程写入(input)用户,另一个线程读取(out)用户,实现读一个,写一个操作。 源码如下:源码中包含着线程安全的解决方法 wait和notify的用法 package com.zuojie; /** * 共享资源 * @author zuojie ...

佐杰的博客 1231

【文献阅读】使用深度语音后验改进独立于说话者的构音障碍可懂度分类

原文名称:本文探讨了利用DeepSpeech后验概率改进说话人无关的构音障碍可理解性分类方法。作者提出了一个基于DeepSpeech(一种端到端的语音转文本引擎)输出的新特征集,用于评估构音障碍患者的语音可理解性。这些新特征在说话人无关的情况下表现良好,能够更好地处理不同说话人的变异性。背景介绍:数据集:特征提取:实验设置:结果:本文提出的新特征集在说话人无关的构音障碍可理解性分类任务中表现出色,特别是在低可理解性和高可理解性类别上。未来的工作将集中在减少低可理解性和中可理解性类别之间的混淆,以进一步提高系

帅小柏的博客 452

java多线程与线程间通信

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

jerrying0203的专栏 1万+

Orange3实战教程:文本挖掘---标注语料库地图

Oreange3,文本挖掘,标注语料库地图用于在二维投影中可视化、聚类文档,并用关键词进行标注。

err2008的专栏 817

基于YOLOv8的包装商品智能检测系统完整指南—含论文、代码

《基于YOLOv8的包装商品智能检测系统》摘要: 本文提出了一套完整的零售商品自动检测解决方案,利用YOLOv8深度学习框架实现高精度、高效率的商品识别。系统针对SKU110K大规模商品数据集(含11,762张高密度货架图像)进行优化,包含数据预处理、模型训练、推理检测和可视化界面全流程。详细介绍了从CSV标注到YOLO格式的转换方法、环境配置指南及技术架构设计。该系统可应用于智能零售、物流仓储等多个场景,有效解决人工盘点效率低、误差大的痛点。实验表明,该系统具备毫秒级检测速度和批量处理能力,为商业数字化转

FJN110的博客 205

Java中TCP通信以及多线程通信

回顾Java多线程在Socket通信中的使用 一、Java中socket编程 socket = IP + 端口号,构成了在网络上唯一能被识别的标识符套接字。 通信的client和server双方都要获取对方的socket才能进行通信,socket之间的通信就是网络通信。 socket之间就是普通的IO流传输。 这篇主要回顾TCP通信,也就是基于字节流的网络传输。 二、一般的单线程socket通信 建立连接的几个步骤: server 端声明 ServerSocket ,然后调用accept() 方法

PanicJaw的博客 678

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java多线程基础知识

1. 程序、进程、线程 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合,指一段静态的代码,是静态对象。 进程(process)是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程。进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域。 线程(thread)是一个程序内部的一条执行路径。线程作为调度和执行的基本单位。 进程调度算法: 先到先服务 短作业优先 时间片轮转 优先级调度 多级反馈队列(既能使高优先级的作业得到响应,又能使短作业进程迅速完成。)

rrq_0324的博客 939

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 多线程通信方式及实现方法

多线程交互

qq_37614659的博客 1891
上一篇: Java基础知识(十一)--多线程
下一篇: Java基础知识(十三)--线程池
新时代Java农民工
博客等级 码龄7年 16粉丝 116原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值