Java多线程Thread-并发协作(生产者消费者设计模式)

一个多线程Ping 类 需求背景:部门内部一个监控项目需要快速Ping批量的IP地址,在网上找了很多资料结合各家之所长,写了一个多线程Ping类,可以实现快速的ping,并且格式化的返回IP状态。主要解决痛点:1.为什不直接用Linux command? 一个两个可以,对于批量上千个ip来说,用Linux command 就有点不太适合了 2.为什么用多线程而不是用多进程? 进程提供了多道编程,充分发挥了计算机部件的 阅读详情

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

解决办法
要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。通常采用进程间通信的方法解决该问题,常用的方法有信号灯法等。如果解决方法不够完善,则容易出现死锁的情况。出现死锁时,两个线程都会陷入休眠,等待对方唤醒自己。该问题也能被推广到多个生产者和消费者的情形。

Java是怎么实现休眠和 放弃的呢?
这里涉及到Thread的几个方法:
wait : 放弃cpu和数据锁
notify:通知wait的Thread重新激活
sleep :睡眠(相当于工人休息)

用java来实现这个模式Demo:
主要的概念 : storage (仓库),Goods(商品),Consumer (消费者),Producer (生产者)。
1、当消费者消费后notify通知生产者去生产,当生产者生产完后notify消费者去消费。
2、当消费者发现仓库中没有可以消费的Storage 放弃锁,让生产者去生产。
3、当生产者发现仓库已经满了放弃Storage锁,放消费者去消费。

Demo中只New 了一个生产者和一个消费者,new多个也是可行的。
只需要 多加 new Thread(new Consumer()).start(); 即可拥有2个消费者
Demo 生产者 while (index<=20) 生产完20个后就关闭了,如果想让永久生产改为while(true) 这样将会永无止境的循环。

package com.example;
import java.util.LinkedList;
import java.util.List;
public class MyClass {
    //仓库
    static List<Goods> storage = new LinkedList<>();
    public static void main(String[] ars){
        System.out.print("hello world ");
        new Thread(new Consumer()).start();
        new Thread(new Producer()).start();
    }

    /**
     * 消费者
     */
    static class Consumer implements Runnable{
        @Override
        public void run() {

            while (true){

                synchronized (storage){
                    while (storage.size()==0){
                        try {
                            storage.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                    Goods goods = storage.remove(0);
                    System.out.println("Consumer:"+goods);
                    storage.notify();
                }
                try {
                    Thread.sleep((long) (Math.random()*1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    }


    /**
     * 生产者
     */
    static class Producer implements Runnable{
        @Override
        public void run() {
            int index =0;
            while (index<=20){

                synchronized (storage){
                    while (storage.size()>=20){
                        try {
                            storage.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                    Goods goods = new Goods();
                    goods.name = "ID:"+index++;
                    storage.add(goods);
                    storage.notify();
                    System.out.println("Producer:"+goods);
                }
                try {
                    Thread.sleep((long) (Math.random()*1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 商品
     */
    static class Goods{
        public String name ;

        @Override
        public String toString() {
            return "-"+name;
        }
    }

}
Java多线程之生产者与消费者 随着软件业的发展,互联网用户的日渐增多,并发这门艺术的兴起似乎是那么合情合理。每日PV十多亿的淘宝,处理并发的手段可谓是业界一流。用户访问淘宝首页的平均等待时间只有区区几秒,但是服务器所处理的流程十分复杂。首先负责首页的服务器就有好几千台,通过计算把与用户路由最近的服务器处理首页的返回。其次是网页上的资源,就JS和CSS文件就有上百个,还有图片资源等。它能在几秒内加载出来可见阿里几千名顶尖工程师的智慧是如何登峰造极。... 阅读详情

相关推荐

【Java学习】第29节:多线程(异步、同步、生产者&消费者)

Java是一种广泛使用的编程语言,由Sun Microsystems(现在是Oracle Corporation)首次推出。它是一种跨平台的编程语言,意味着您可以编写一次代码,然后在多个不同的计算机系统上运行,而无需对其进行修改。Java被广泛用于开发各种类型的应用程序,包括企业级应用、移动应用、Web应用、游戏等。

m0_46013789的博客 1575

Java多线程和并发

Java多线程和并发 进程和线程的区别 基本概念见https://cloud.tencent.com/developer/article/1688297 进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的? 1. 基本概念: 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发; 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:

weixin_38404857的博客 351

Java多线程设计模式实战指南与代码实例

同步模式主要是通过锁来控制对资源的访问。在Java中,synchronized关键字是最常用的同步机制。它可以用在方法上,也可以用在代码块中。应用场景包括但不限于:- 防止多个线程同时修改同一个数据。- 当多个线程访问共享资源时,保证数据的一致性。生产者消费者问题(Producer-Consumer Problem)是一个经典的多线程同步问题,它涉及到一组生产者(Producers)和一组消费者(Consumers)共同操作一个共享缓冲区(Buffer)。

weixin_29867767的博客 974

生产者消费者问题-代码详解(Java多线程)

文章目录一、生产者消费者问题二、代码实现三、拓展知识 一、生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。 该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲

末尾卡片和博主交流学习! 1万+

Java多线程实现生产者消费者

编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。

通用任务分发框架(TaskDispatcher),基于生产者消费者模式

NULL 博文链接:https://assertmyself.iteye.com/blog/2343736

java多线程之生产者消费者经典问题

今天研究了一下java多线程,顺便写了一下多线程中的经典问题-----生产者消费者经典问题,参照了网上的各种写法之后自己写了一个,如下所示 /**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者、消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里是馒头类 * 第四,既然是线程,那么就不是一对

亡羊补牢 5万+

java中ping命令ping工具类(循环ping)

java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:Ping空格IP地址。 该命令还可以加许多参数使用,具体是键入Ping按回车即可看到详细说明。 ping是一个DOS命令,一般用于检测网络通或不通 ,也叫时延,其值越大,速度越慢。 PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所 希望的ICMP echo (ICMP回声应答)。

Java——多线程高并发系列之生产者-消费者模式

Java——多线程高并发系列之生产者-消费者模式

贝尔摩德苦艾酒 7357

海洋科学—物理海洋学 第五章 海洋环流

本章是基于《海洋科学导论》,但里面涉及到的重要的公式推导是专门拎出来推的,主要借鉴董昌明老师的《物理海洋学导论》,其中有一些多出来的推导,会在更新完整个物理海洋学之后重新拿出来一一讲解,最后开一个番外篇

qq_58518586的博客 1万+

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

不忘初心 方得始终 2977

多线程生产者、消费者模式中,如何停止消费者

多线程生产者、消费者模式中,如何停止消费者 ?多生产者情况下对“毒丸”策略的应用 生产者、消费者模式是多线程中的经典问题。通过中间的缓冲队列,使得生产者和消费者的速度可以相互调节。 发散:一个主线程控制多个子线程,多个主线程控制多个子线程(countDownLunch使用理解) 对于比较常见的单生产者、多消费者的情况,主要有以下两种策略: 通过volatile boolean prod...

hnhygkx的博客 3316

c语言播放背景音乐

相信很多童鞋都在为大学课设而伤透头脑,而背景音乐的使用无疑会成为其中的一个亮点(总比没有好吧(╯▽╰)),故接下来我将介绍一下如何用C播放音乐。我用的编译器是CodeBlocks16.01接下来新建一个C文件建立完后是这样滴然后添加其中mciSendString()函数是由&lt;mmsystem.h&gt;库提供的供播放音乐(MP3)的函数第一个参数是歌曲所在的绝对路径 打开音乐所在位置 复制这...

qq_41443987的博客 3万+

《Java 多线程全面解析:从基础到生产者消费者模型》

本文系统介绍了Java多线程编程的核心知识。首先讲解了多线程基础概念,包括线程与进程的区别、并发与并行的异同。其次详细阐述了Java实现多线程的三种方式:继承Thread类、实现Runnable接口和Callable接口,并对比了它们的优缺点。然后介绍了线程常用操作,如线程命名、休眠、优先级设置和守护线程。重点讲解了线程同步机制,包括同步代码块、同步方法和Lock锁的使用,以及如何避免死锁问题。最后通过生产者消费者模型这一经典案例,展示了多线程协作的实际应用。文章结合代码示例,帮助读者全面掌握Java多线程

yh云想的博客 1330

【数字IC设计】Centos 7桌面版 安装Synopsys EDA Tools

简称DC,是Synopsys公司用于做电路综合的核心工具,可以将HDL描述的电路转换为基于工艺库的门级网表。

qiumingT的博客 9790

泛微OA自定义post接口和路径(无侵入)

泛微OA自定义post接口和路径(无侵入)

技术分享 3868

Java多线程之并发协作生产者消费者问题

最简单的生产者消费者问题PV操作解法 int buffer; Semaphore sp=1,sc=0; //下面进程并发执行 process producer(void) { while(1) { {生产一个产品product}; P(sp); Buffer= product; V(sc); } } process c...

dustdawn的博客 293

裂缝二维检测:裂缝的长度和宽度检测

这一节,我们需要去整合一下前面的代码,在进行长度和宽度的测量时,需要裂缝的类型、个数、面积的帮助。这一章是本专栏的核心部分。以上代码我均试过,由于本人能力有限,看不懂代码,最终还是没有采用,使用的是最普通检测宽度的方法,即求得骨架总长度后,用总面积求取平均宽度。

m0_62919535的博客 4237

Java多线程实现生产者消费者问题

Java多线程实现生产者消费者问题 问题描述: 假设在汉堡店中,有最多能放10个汉堡的窗口,有生产汉堡的厨师,还有前来消费汉堡的消费者。厨师在窗口没摆满汉堡时一直生产汉堡放到窗口,消费者在窗口有汉堡时能进行消费。 模型抽象: 生产者(厨师):新加产品到缓冲池,当缓冲池产品达到最大值(满了)时进入wait状态。 消费者:提取缓冲池中的产品,当缓冲池产品为空时进入wait状态等待 缓冲池(窗口):存放...

qq_41257358的博客 1699

吊打原版YOLOv8!ASF-YOLO多尺度融合+注意力机制实战解析(遥感/医疗/质检均适用)

ASF-YOLO融合YOLOv8的创新目标检测框架摘要 ASF-YOLO是针对小目标检测优化的先进框架,采用三重特征编码器和尺度序列融合技术增强多尺度特征提取能力。核心创新包括: 三重特征编码器(TPE)融合跨层级信息 尺度序列特征融合(SSFF)模块通过3D卷积处理多尺度信息 通道-位置注意力机制(CPAM)聚焦关键特征区域 Zoom_cat模块实现自适应多尺度特征融合 该框架特别适用于医学影像、遥感检测等小目标密集场景,通过动态特征权重调整显著提升检测精度。关键技术实现包含多尺度特征统一、3D卷积序列处

FJN110的博客 526

【Simulink教程案例9】基于simulink的BPSK,QPSK调制解调通信系统建模与仿真——使用simulink自带模块设计

BPSK (Binary Phase Shift Keying)-------二进制相移键控。是把模拟信号转换成数据值的转换方式之一,利用偏离相位的复数波浪组合来表现信息键控移相方式。BPSK使用了基准的正弦波和相位反转的波浪,使一方为0,另一方为1,从而可以同时传送接受2值(1比特)的信息。BPSK的映射关系如下所示:BPSK调制过程将输入的1010二进制数据中的0都转化为-1,使得非极性码变为极性码。

FPGA/MATLAB学习教程/源码/项目合作开发 3483

JAVA多线程——线程协作(生产者消费者问题)

JAVA多线程——线程协作 生产者消费者问题 生产者消费者问题:这是一个线程同步问题,生产者消费者共享同一个资源,并且生产者消费者之间相互依赖,互为条件。 对于生产者,没有生产产品之前,要通知消费者等待,而生产了产品之后,又要放到缓存区,通知消费者来消费 对于消费者,在消费之后,要通知生产者已经结束消费,需要生产新的产品以供消费 在生产者消费者问题中,仅有的synchronized是不够的 synchronized实现了同步,但不能用来实现不同线程之间的通信 解决线程之间通信问题的方法 wait()

万里顾一程的博客 530

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

并发编程中常见的设计模式,c++多线程如何设计

类 Unix 的操作系统中创建进程的 API 是 fork(),传统的 fork() 函数会创建父进程的一个完整副本,例如父进程的地址空间现在用到 了1G 的内存,那么 fork() 子进程的时候要复制父进程整个进程的地址空间(占有 1G 内存) 给子进程,这个过程是很耗时的。没有修改操作,也就是保持了不变性。如果在某一段业务高峰期的时间里生产者“生产”任务的速率很快,而消费者“消费”任务速率很慢,由于中间的任务队列的存在,也可以起到缓冲的作用,我们在使用MQ中间件的时候,经常说的削峰填谷也就是这个意思。

zxf347085420的博客 1682

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

多线程并发环境生产者-消费者,kotlin

消费11 29 @1680141217615。生产->13 29 @1680141217619。消费14 28 @1680141217620。消费15 31 @1680141217620。消费0 31 @1680141217600。消费

Zhang Phil 917

Statistics and Machine Learning Toolbox

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

利用Java实现多线程模拟生产者消费者问题

利用Java多线程模拟实现生产者消费者问题 利用Java提供的Thread类,创建继承于Thread的类。重写run()方法。 注意main()方法中new的hellowolrd实例需要与这里的类名helloworld同名。 此问题设置生产者为三个User线程,模拟不断登录系统,最多登录200次后结束登录。 设置一个备份线程,作为消费者,备份每个用户登录的过程。 因为要统计登陆的次数,设置了一...

Trumpetertimes的博客 809

Java多线程之三生产者消费者模式

阻塞队列

u011411283的专栏 453
上一篇: Android 内部跳转URi协议的定义和实现方案
下一篇: java Android OKHttp HTTPS 请求证书验证 PEM证书(1)
doubleping
博客等级 码龄17年 23粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值