线程的通信

news2025/1/24 22:54:54

1.需求(为什么需要线程通信)

当我们需要多个线程完成同一任务时,并且希望他们有规律的执行,那么多线程之间需要一些通信机制,并且可以协调他们的工作,以此实现多个线程共同操作共享数据.

例 : A做包子,B吃包子,包子相当于共享操作的数据,B必须等到A做好才能吃,那么线程AB间就需要通信.即等待唤醒机制.

2.等待唤醒机制

这是多线程的一种协同的机制.谈到线程我们常常想到是多个线程竞争一把锁.但不完全是这样.线程之间也可以实现协同.

在一个线程满足某个条件时,就进入等待状态(wait),等待其他线程进行到某处指定代码时,将等待状态的线程唤醒(notify).可以指定wait的时间,过了这个时间可以自动唤醒@也可以使用notifyAll来唤醒所有等待的线程.

  • wait : 线程不在参与活动,将释放CPU调度.进入wait set中,不会浪费CPU资源.也不会去竞争锁.此时线程状态为WAITING或者是TIME_WAITING.他等待其他线程执行某个操作(notify/wait(time)执行了time的时间),才能够将其从wait set中释放出来,重新参与CPU调度.
  • notify : 选取待在wait set中的线程将其释放重新参与CPU调度.
  • notifyAll : 将全部待在wait set中的线程全部释放参与CPU调度.

3.例 : 交替打印出输出的一百以内的数.

解释 : 调用start方法启动线程.假设是线程1(当然也可能是线程2)进入while语句并握住锁,进行输出语句后,调用wait()释放锁,线程2握住锁,进行到notify()唤醒线程1重新参与CPU调度......

public class WaitNotifyTest {
    public static void main(String[] args) {
        WaitNotify w = new WaitNotify();
        Thread t1 = new Thread(w, "线程-1");
        Thread t2 = new Thread(w, "线程-2");
        t1.start();
        t2.start();
    }
}
class WaitNotify implements Runnable {
    int change = 100;
    Object obj = new Object();
    @Override
    public void run() {
        while (true) {
            synchronized(obj) {
                obj.notify();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (change > 0) {
                    System.out.println(Thread.currentThread().getName() + "\t" + change);
                    change--;
                }
                try{
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

控制台
线程-1	100
线程-2	99
线程-1	98
线程-2	97
线程-1	96
线程-2	95
线程-1	94

注 : 

  • 这三个方法的使用必须都要在同步代码块或者同步方法中.
  • 此三个方法的调用者必须是同步监视器,否则会触发异常.
  • 按住Ctrl键,可以查看该三个方法的源码源码.
    public final native void notify();
    public final void wait() throws InterruptedException {
        wait(0L);
    }
  • 此三个方法都声明在Object类中,Ctrl+F12,查看Object类.3bb32a0506434569b3d6986a6c462944.pngfaf9d632f5334364a7cbdcdbca5dc4b2.png
  • 因为同步监视器可以是任何对象(保证线程安全性需要满足唯一),由于该三个方法是Object类中的方法,所以同步监视器可以调用.

4.wait()与sleep()的区别.

(1). 查看源码 : 

public static native void sleep(long millis) throws InterruptedException;
public final void wait() throws InterruptedException {
        wait(0L);
    }

(2) 相同点 : 

一旦执行,都可以阻塞线程.

(3) 不同点 : 

  • 声明的位置不同 : sleep()方法声明在Thread类中,而且是静态的方法.wait()方法声明在Object类中.
  • 使用的场景不同 : sleep()可以声明在任何所需要的场景.wait()必须声明在同步代码块或同步方法中(因为该写方法必须通过同步监视器调用).
  • CPU调度 : 使用sleep()并不会释放CPU调度,只是线程阻塞.而wait()阻塞线程,并且释放该线程的CPU调度.
  • 结束阻塞方式 : sleep(time)方法在时间time之后结束阻塞.wait(time)方法在时间time之后或者notify/notifyAll结束阻塞.

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1556124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP Fiori开发中的JavaScript基础知识9 - 代码注释,严格模式,JSON

1 背景 本文将介绍JavaScript编程中的三个小知识点:也即代码注释,严格模式,JSON文件。 2 代码注释 JavaScript的代码注释方式如下: // Single line comment/* Multi line comment */3 严格模式 JavaScript的"strict mod…

vue3封装Element表格自适应

表格高度自适应 分页跟随表格之后 1. 满屏时出现滚动条 2. 不满屏时不显示滚动条 坑 表格设置maxHeight后不出现滚动条 解决方案 表格外层元素设置max-height el-table–fit 设置高度100% .table-box {max-height: calc(100% - 120px); } .el-table--fit {height: 100%; }示例代…

rust使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

想要在不同的平台上运行flutter doctor命令,就需要知道对应的平台是windows还是linux,如果是windows就需要调用cmd命令,如果是linux平台,就需要调用sh命令,所以可以通过cfg!实现不同平台的判断,然后调用不同…

[flask]http请求//获取请求头信息+客户端信息

在网站中查询请求头信息,可以通过以下操作进行 右键然后选择检查 进入改页面后选择文档,刷新一下页面就好了 获取所有的请求头信息 print(request.headers, type(request.headers)) 在flask模块中,使用上面的输出函数就可以查看到有关于请求…

鸿蒙OS开发实战:【Socket小试MQTT连接】

本篇分享一下 HarmonyOS 中的Socket使用方法 将从2个方面实践: HarmonyOS 手机应用连接PC端 SocketServerHarmonyOS 手机应用连接MQTT 服务端 通过循序渐进的方式,全面了解实践HarmonyOS中的Socket用法 学习本章前先熟悉文档开发知识更新库gitee.com…

3-zookeeper之ZAB协议

Zookeeper ZAB协议 概述 ZAB(Zookeeper Automic Broadcast)是一套专门为Zookeeper设计的用于进行原子广播和崩溃恢复的协议ZAB协议主要包含了两个功能 原子广播:保证数据一致性崩溃恢复:保证集群的高可用 ZAB协议本身是基于2PC算法来进行的设计&#…

『VUE』05. 条件渲染(详细图文注释)

目录 新建IfDemo.vuev-if 和 v-elsev-if | v-else-if | v-elsev-showv-show 与 v-if 的区别,性能分析总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 在前文的项目基础上继续~ 新建IfDemo.vue IfDemo.vue内容如下 <scri…

前端-深入探讨网络面试题

第一关 请求-文件、数据、连接 文件类的请求&#xff1a;加载HTMl、CSS 数据&#xff1a; ajax请求&#xff08;基于HTTP&#xff0c;HTTP基于TCP&#xff09;&#xff0c;如何建立连接的&#xff08;三次握手&#xff0c;为什么不是两次或者四次&#xff09;&#xff0c;sock…

用MATLAB编写一个简易的贪吃蛇游戏

编写一个贪吃蛇游戏的MATLAB代码需要涉及到游戏逻辑、图形用户界面(GUI)的创建、事件监听&#xff08;如键盘操作&#xff09;和游戏状态更新等。以下是一个简化的贪吃蛇游戏MATLAB代码示例&#xff0c;展示了基本的游戏框架和逻辑。 此代码创建了一个游戏窗口&#xf…

解决GNU Radio+USRP实现OFDM收发在接收端QPSK星座图映射无“抖动”问题

文章目录 前言一、遇到的问题二、解决方案三、重新编译安装四、验证五、资源自取 前言 本文记录在 GNU RadioUSRP 实现 OFDM 收发时&#xff0c;在接收端 QPSK 星座图映射无“抖动”问题的解决方法&#xff0c; 一、遇到的问题 我遇到的问题是&#xff0c;现在搭建的 OFDM 模…

Qt实现Kermit协议

1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…

Spark SQL— Catalyst 优化器

Spark SQL— Catalyst 优化器 1. 目的 本文的目标是描述Spark SQL 优化框架以及它如何允许开发人员用很少的代码行表达复杂的查询转换。我们还将描述Spark SQL如何通过大幅提高其查询优化能力来提高查询的执行时间。在本教程中&#xff0c;我们还将介绍什么是优化、为什么使用…

先进电机技术 —— 何为轮毂电机?

一、轮毂电机 轮毂电机&#xff08;Hub Motor&#xff09;是一种将电动机集成到车轮内部&#xff0c;直接驱动车轮转动的电动车驱动技术。这种设计省去了传统的传动轴、差速器、半轴等机械传动部件&#xff0c;使得动力传输更为直接、高效。 轮毂电机的优点&#xff1a; 1. 结…

elementui el-input输入框类型为textarea时,将输入的数据保存换行和空格,并展示换行和空格

el-input输入框类型为textarea时&#xff0c;如果不做数据处理&#xff0c;是不会保存换行和空格的说输入了换行&#xff0c;但是保存数据后不会进行换行&#xff0c;需要保存输入的换行。 1、效果图 输入状态&#xff1a; 显示时&#xff1a; 2、实现代码 2.1、html部分&am…

【CKA模拟题】综合案例演示如何创建pv和pvc

Useful Resources: Persistent Volumes & Claim 题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesCreate a PersistentVolume (PV) and a PersistentVolumeClaim (PVC) using an e…

排序---数组和集合

1、数组排序 Arrays.sort(int[] a)这种形式是对一个数组的所有元素进行排序&#xff0c;并且是按照从小到大的排序。 public static void main(String[] args) {Integer []arr {1,2,3,4,5,6};//升序Arrays.sort(arr);for (int x:arr){System.out.print(x " ");}Sys…

【Web APIs】正则表达式

目录 1.正则表达式 2.正则表达式语法 3.元字符 3.1边界符 3.2量词 3.3字符类 4.修饰符 1.正则表达式 正则表达式&#xff08;Regular Expression&#xff09;是用于匹配字符串中字符组合的模式&#xff0c;在 JavaScript中&#xff0c;正则表达式也是对象。通常用来查…

数据分析之POWER Piovt的KPI设置

内容总结&#xff1a; 1.两个表格关联不上&#xff1a;需要添加辅助列&#xff0c;建立关联 2.添加辅助列后还关联不上&#xff1a;将虚线变为实线 3.根据需求要增加一些度量值 4.设置KPI后&#xff0c;绝对值选1后设定百分比 5.在透视表里面加入KPI状态 导入所关联的数据后建立…

取证之内存取证工具Volatility学习

一、简介 Volatility是一款开源的内存取证分析工具&#xff0c;支持Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android等多类型操作系统系统的内存取证方式。该工具是由python开发的&#xff0c;目前支持python2、python3环境。 二、安装 1、下载地址 GitHub - …

Matlab之求直角坐标系下两直线的交点坐标

目的&#xff1a;在直角坐标系下&#xff0c;求两个直线的交点坐标 一、函数的参数说明 输入参数&#xff1a; PointA&#xff1a;直线A上的点坐标&#xff1b; AngleA&#xff1a;直线A的倾斜角&#xff0c;单位度&#xff1b; PointB&#xff1a;直线B上的点坐标&#xf…