首页 > 其他分享 >线程通信

线程通信

时间:2025-01-22 13:10:18浏览次数:1  
标签:void 通信 flag 线程 voice class wait

  1. 生产者和消费者问题

    1. 共享同一个资源,需要线程同步:synchronized
    2. 两者相互依赖,需要线程通信:wait()、notify()
  2. wait()、notify()

    1. 解决线程通信

    2. 每个对象都有锁,因此是Object类的方法

    3. 只能在同步方法和同步代码块中使用,否则会抛出异常IllegalMonitorStateException

    4. wait()和notify()应该成对出现,不是说在一个方法里成对,而是分布在不同的方法里

    5. 为了防止有的线程太快,wait()让他停下来,等到慢的线程赶上了,再notify()快的线程,而且二者都有可能,所以要有两对

      方法 注意
      wait() 一直等待,直到其他线程唤醒,与sleep()不同,会释放锁
      wait(long timeout)
      notify() 唤醒一个处于等待状态的线程
      notifyAll() 唤醒所有,优先级高的优先调度
  3. 解决方式

    1. 管程法:新建一个缓冲区类,存放产品。生产者将生产的数据放入缓冲区,消费者从缓冲区拿数据
    2. 信号灯法:产品本身设置一个标志位flag

管程法

class Producer extends Thread{
    SynContainer synContainer;
    public void run() {
        synContainer.produce(new Chicken(i));
    }
}
class Consumer extends Thread{
    SynContainer synContainer;
    public void run() {
        synContainer.consume();
    }
}
// 产品
class Chicken {}
// 缓冲区(新建一个缓冲区类)
class SynContainer {
    // 容器大小为10
    Chicken[] chickens = new Chicken[10];
    // 计数器
    int count;
    
    // 生产者放入产品
    synchronized void produce(Chicken chicken) throws InterruptedException {
        // 判断是否满了
        if ((count == chickens.length)){
            wait();
        }
        // 没满,放入产品
        chickens[count++] = chicken;
        System.out.println("生产了一只鸡" + chicken.id);
        // 通知消费者消费
        notifyAll();
    }

    // 消费者消费产品
    synchronized void consume() throws InterruptedException {
        // 判断缓冲区是否有值
        if (count == 0){
            wait();
        }
        // 有值,就消费
        Chicken chicken = chickens[--count];
        System.out.println("消费了" + chicken.id);
        // 通知生产者生产
        notifyAll();
    }
}

信号灯法

class Actor extends Thread{
    TV tv;
    public void run() {
        tv.perform("快乐大本营播放中");
    }
}
class Audience extends Thread{
    TV tv;
    public void run() {
        tv.watch();
    }
}

// 产品,自身设置一个标志位
class TV{
    String voice;
    boolean flag = false;

    // 表演
    synchronized void perform(String voice) throws InterruptedException {
        if (flag){
            wait();
        }
        this.voice = voice;
        System.out.println("演员表演了:"+voice);
        flag = true;
        notifyAll();
    }

    // 观看
    synchronized void watch() throws InterruptedException {
        if (!flag){
            wait();
        }
        System.out.println("观众观看了:"+voice);
        voice = null;
        flag = false;
        notifyAll();
    }
}

标签:void,通信,flag,线程,voice,class,wait
From: https://www.cnblogs.com/xinyounuanyang/p/18685599

相关文章

  • C/C++ 创建Socket实现双工通信
    点击查看代码实现简单的Socket通信服务端代码(Server)#include<stdio.h>#include<winsock2.h>#pragmacomment(lib,"ws2_32.lib")#definePORT9999intmain(){WSADATAWSAData;SOCKETsock,msgsock;structsockaddr_inServerAddr;......
  • 【基于无线电的数据通信链】Link 16工作特点级美军标
    Link16是美军(以及北约成员国)使用的高性能战术数据链,用于军事通信、指挥与控制(C2)、情报共享以及战场管理。与Link11相比,Link16提供了更高的带宽、更快的通信速率和更强的安全性。它通常用于实时战术信息交换,如飞机、舰船、地面站之间的目标位置、敌情、战术命令和......
  • C# 多线程同步(Mutex | Semaphore)
    Mutex:用于保护临界区,确保同一时间只有一个线程能够访问共享资源;Semaphore:允许同时有多个线程访问共享资源,但会限制并发访问的数量。 Mutex运行输出 Semaphore运行输出 namespaceSyncThreadDemo{internalclassProgram{staticstringstrloc......
  • uart串口的低速通信基础知识及模块代码(来自正点原子P15)
    正点原子P15在PL端的uart电路参考,PS端uart和PL端一致,这里不做重复,uart电路由电脑端进行供电,即uart和主芯片之间除利用uart_tx和uart_rx通信外是独立的。从上图中可以看到,FPGA芯片的PL_UART1_TX连接到CH340的RXD管脚,FPGA芯片的PL_UART1_RX连接到CH340的TXD管脚,CH340的PL_CH......
  • 《操作系统真象还原》第九章 线程(一) 在内核中实现线程
    第九章线程(一)在内核中实现线程本文是对《操作系统真象还原》第九章(一)学习的笔记,欢迎大家一起交流。我们在本节的任务:创建并初始化PCB模拟pthread_create函数创建线程并执行线程函数首先我们要明确内核级线程的优势,内核级线程是cpu的一个调度单位,当一个进程中的线程越多,享......
  • Java多线程循环list集合
    1.Java多线程基本概念在开始之前,先简单了解一下Java的多线程。如果一个应用程序在执行多个任务时,每个任务都是独立的,那么我们就可以把这些任务放在多个线程中并发执行。Java通过Thread类和Runnable接口提供了创建和管理线程的技术。1.1创建线程创建线程最常见的方法有两......
  • [Qt]系统相关-多线程、线程安全问题以及线程的同步机制
    目录一、Qt多线程编程1.介绍2.多线程的操作线程的创建QThread的常用API使用案例3.Qt线程的使用场景二、线程安全问题1.互斥锁介绍使用案例2.读写锁三、线程的同步1.条件变量2.信号量一、Qt多线程编程1.介绍    Qt中的多线程的底层原理和注意事项等......
  • JavaFX + Maven实战:可内网联机的多人在线五子棋游戏开发全解析(附Socket通信与EXE打包)
    目录1.项目背景与需求分析1.1为何选择内网联机五子棋?1.2内网联机方案的附加价值2.技术选型与开发环境2.1GUI框架选型:JavaFXvsSwing深度对比2.1.1渲染性能与现代化特性2.1.2渲染性能与现代化特性2.2构建工具:Maven3.8.8核心优势2.2.1依赖管理自动化2.2.2EXE......
  • golang 多线程 备份文件夹到兄弟层级 wail group
    golang多线程备份文件夹到兄弟层级wailgroupD:\GolangTools\src\config\config.gopackageconfigtypeConfigHandlerstruct{ includeDirNames[]string includeFileNames[]string excludeDirNames[]string excludeFileNames[]string}funcNewConfigHandler......
  • 面试必会(嵌入式)操作系统面试高频(三)线程与进程
    目录1.请你说说CPU工作原理⭐⭐2.死锁的原因、条件?以及如何预防⭐⭐⭐3.死锁与活锁⭐⭐死锁:活锁:解决活锁问题的一般策略包括:4.说说sleep和wait的区别?⭐⭐⭐sleep和wait的区别:5.简述epoll和select的区别,epoll为什么高效?⭐⭐⭐⭐epoll:Select:epoll为什么高效?拷贝开......