JAVA多线程设计模式篇 9、Woker Thread 模式——闲时摸鱼、忙时干活

如何使用Perfetto通过trace分析性能问题(六)——Common queries trace, sql, trace processor 阅读详情

文章目录

在Thread-Per-Message模式中每个工作任务都会启动一个新的线程,为每个或者每一批任务创建一个线程以对其进行执行,通常是一种奢侈而不现实的事情。

而在Worker Thread 模式中,工人线程会反复进行工作,无需启动新线程。比较常见的一种做法是复用一定数量的线程,由这些线程去执行不断执行产生的任务。

绝大多数的Web服务器就是采用这种方法。例如,Tomcat服务器复用一定数量的线程用于处理其接收到的请求。Worker Thread 模式的核心思想是使用队列对待处理的任务进行缓存,并复用一定数量的工作者线程去取队列中的任务进行执行。

1.优点

  • 抵消线程创建的开销,提高响应性。
  • 封装了工作者线程生命周期管理。
  • 减少销毁线程的开销。

2.示例

如下代码,Channel类存储任务,使用了生产者-消费者模式。

WorkerThread[] threadsPool 是线程池,使用的是Worker Thread模式,也称为线程池模式。

//Worker线程池
public class Channel {
    private static final int MAX_REQUEST=100;
    private final Request[] requestQueue;
    private int tail;
    private int head;
    private int count;
    private final WorkerThread[] threadsPool;
    public Channel(int threads){
        this.requestQueue=new Request[MAX_REQUEST];
        this.head=0;
        this.tail=0;
        this.count=0;
        threadsPool=new WorkerThread[threads];
        for(int i=0;i<threadsPool.length;i++){
            threadsPool[i]=new WorkerThread("Worker-"+i,this);
        }
    }
    public void startWorkers(){
        for(int i=0;i<threadsPool.length;i++){
            threadsPool[i].start();
        }
    }
    public synchronized void  putRequest(Request request){
        while(count>=requestQueue.length){
            try{
                wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        requestQueue[tail]=request;
        tail=(tail+1)%requestQueue.length;
        count++;
        notifyAll();
    }
    public synchronized Request takeRequest(){
        while(count<=0){
            try{
                wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        Request request=requestQueue[head];
        head=(head+1)%requestQueue.length;
        count--;
        notifyAll();
        return request;
    }
}
//客户线程,发送请求
public class ClientThread extends Thread{
    private final Channel channel;
    private static final Random random=new  Random();
    public ClientThread(String name,Channel channel){
        super(name);
        this.channel=channel;
    }
    public void run(){
        try{
            for(int i=0;true;i++){
                Request request=new Request(getName(),i);
                channel.putRequest(request);
                Thread.sleep(random.nextInt(1000));
            }
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}
//工人线程,处理请求
public class WorkerThread extends Thread{
    private final Channel channel;
    public WorkerThread(String name,Channel channel){
        super(name);
        this.channel=channel;

    }
    public void run(){
        while(true){
            Request request=channel.takeRequest();
            request.execute();
        }
    }
}
//模拟请求
public class Request {
    private final String name;
    private final int number;
    private static final Random random=new Random();
    public Request (String name,int number){
        this.name=name;
        this.number=number;
    }
    public void execute(){
        System.out.println(Thread.currentThread().getName()+" executes "+this);
        try{
            Thread.sleep(random.nextInt(1000));
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
    @Override
    public String toString(){
        return "[Request from "+name+" NO."+number+"]";
    }
}
//启动类
public class Tester {
    public static void main(String[] args){
        Channel channel=new Channel(5);
        channel.startWorkers();
        new ClientThread("Alice",channel).start();
        new ClientThread("Bobby",channel).start();
        new ClientThread("Chris",channel).start();
    }
}

总结

java.util.concurrent.ThreadPoolExecutor就是Worker Thread 模式的一个实现。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

多线程基础之设计模式Worker-Thread模式 阅读详情

相关推荐

十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸

不管哪种绘图软件,二维或三维绘图,最终均需要转换成工程图纸,才能交给现场人员进行制作,这是任一产品图都要经历的过程。那本章开始,我们一起看一下Inventor是如何实现工程图纸?

Crazydoubao的博客 4910

轻松学习多线程-09-Worker Thread 模式

目录 目录 Worker Thread 模式 实际案例 定义 测试 实现方式 UML &amp; Code UML Code 系列导航 Worker Thread 模式 Worker Thread 模式就是没有工作就一直等待,工作来了就进行处理。 实际案例 类信息概览: 类名 说明 Main.java 方法的总入口 Cli...

4万+

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1091

多线程编程模式之Worker Thread(线程池模式)

Worker Thread Worker Thread 模式介绍 Worker 的意思是工作的人。在Worker Thread 模式里,工人线程将逐个取回任务并进行处理。当所有工作全部完成后,工人线程会等待新的工作到来; 如果从“工人聚集”的来看,该模式也可以称为“线程池”模式; Worker Thread 使用场景 提高吞吐量:避免启动线程所需要花费的时间;当然,代价是内存空间,因为有多个“工...

博采众长,自成一派; 7351

2025年一篇解决Windows11安装医学图像处理工具-FSL(各种问题解决,过程详细,小白轻松安装)

2025年一篇帮你解决FSl安装所有问题,包括环境安装、使用说明、常见问题,过程简单易懂,小白轻松安装。

weixin_52145255的博客 2524

Quartus ||———基于Verilog HDL的数字秒表设计实验

Quartus ||———基于Verilog HDL的数字秒表设计实验一、实验目的二、实验步骤(一)新建工程(二)添加设计文件(三)综合分析与功能仿真1、综合分析2、功能仿真 一、实验目的 用Verilog HDL设计一个数字跑表,所需引脚和功能如下: 二、实验步骤 (一)新建工程 在创建好工程名称后,选定芯片类型 (二)添加设计文件 新建Verilog文件,键入代码如下 module n_clk_top( input clk, input rese

TBMmagic的博客 5526

Worker Thread

        这个模型也称为背景线程。把工作交个被人,让别人启动一个线程做交给的任务,自己继续做自己的事,这是Thread Per Message。而在Worker Thread中,任务交给别人后,并不是每次都开启一个线程,而是不断的重复利用已有的线程。事实上开启一个线程是很耗费时间的工作。         实例中:Request是委托者,它有execute功能。WorkThread不断的...

2012到2014 217

深入浅出:CosineLRScheduler 调度器的原理与实战应用

本文深入解析了CosineLRScheduler调度器的核心原理与实战应用,详细介绍了余弦退火算法及其在深度学习模型训练中的优势。通过参数配置建议、PyTorch实现示例和常见问题解决方案,帮助开发者高效应用该调度器提升模型性能,特别适用于计算机视觉和自然语言处理任务。

sss66的博客 859

worker thread

最近用worker thread用的比较频繁,找到了一篇讲workthread讲的非常好的blog,请戳这里 ps,那篇blog写的非常好,但是你能想象吗?!这是作者2001写的,15年了 再结合我最近碰到的问题说两句,以下是blog中提到的 Worker threads and the GUI II: Don't touch the GUI That's right. A wor

u012905879的专栏 864

LabVIEW多设备采集实战:1个程序同时控制3个RS485 Modbus仪表

本文详细介绍了如何使用LabVIEW实现多设备RS485 Modbus同步采集,涵盖硬件架构设计、多线程通信框架搭建、数据帧解析技巧及性能优化策略。通过实际项目案例,展示如何解决端口冲突、数据解析错误等工业自动化常见问题,提升采集系统实时性与可靠性。

qsc901234的博客 302

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro

Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 547

【内核调度】【休眠进程的唤醒】【wake_up_process】

wake_up_process 一般当队列里面为空的时候,核心调度器(是否是核心调度器还需要后续去confirm)会在已经睡眠的task中通过调用wake_up_process函数将其唤醒,然后选择合适的cpu来运行 /** * wake_up_process - Wake up a specific process * @p: The process to be woken up. * * Attempt to wake up the nominated process and move i

勿于浮沙筑高台 4751

网络安全系列-四十三:使用Suricata分析恶意流量pcap文件

本文基于[网络安全系列-三十六:使用Suricata IDS分析pcap文件]和 [网络安全系列-四十二: Suricata之rulesets的激活、更新及动态加载]的基础上,使用suricata针对包含恶意流量的pcap文件进行分析,触发事件告警,并对suricata输出的日志进行逐个分析,让你掌握针对恶意流量的分析步骤,及怎么查看suricata输出的日志。

penriver的博客 2886

Day853.WorkerThread模式 -Java 并发编程实战

解决并发编程里的分工问题,最好的办法是和现实世界做对比。对比现实世界构建编程领域的模型,能够让模型更容易理解。Thread-Per-Message 模式,类似于现实世界里的委托他人办理,而今天介绍的 Worker Thread 模式则类似于车间里工人的工作模式。如果你在设计阶段,发现对业务模型建模之后,模型非常类似于车间的工作模式,那基本上就能确定可以在实现阶段采用 Worker Thread 模式来实现。Worker Thread 模式和 Thread-Per-Message 模式的区别有哪些呢?

阿昌爱Java 681

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java workthread_Java多线程20 Worker Thread模式

1.Worker Thread模式Worker的意思是工作的人,在Worker Thread模式中,工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来。Worker Thread模式也被成为Background Thread(背景线程)模式,另外,如果从保存多个工人线程的场所这一点看,我们也可以称这种模式为Thread Pool模式。2.W...

weixin_32722209的博客 333

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入浅出Java线程池Worker类

本文将以线程池 ThreadPoolExecutor 中成员变量的分析,了解到Runnable、Worker、Thread 以及 BlockingQueue 在线程池中的关系。然后以任务提交 `sumbit()` 函数作为入口,探究了线程池中线程的创建、执行以及保活的实现,对线程池的工作流程和原理也有了很好的理解。

程序猿周周的博客 2141

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java 多线程设计模式

安全性:不损坏对象不安全是指,对象的状态处于非预期状态,比如账户余额变成了负值生存性:进行必要的处理生存性是指:程序能正常运行,可进行必要的处理,影响生存性的典型问题有出现死锁复用性:可再利用类复用性是指代码重用,若复用性好,可减少大量重复代码性能:能快速,大量进行处理性能有两个方面的考虑因素:吞吐量和响应性,客户端程序比较重视响应性,服务端程序更重视吞吐量,吞吐量是指单位时间内完成的任务,响应性是指提交任务后多长时间内能收到程序的反馈。

假装你是大灰狼的专栏 814

Java并发编程实战~Worker Thread模式

在上一篇文章中,我们介绍了一种最简单的分工模式——Thread-Per-Message 模式,对应到现实世界,其实就是委托代办。这种分工模式如果用 Java Thread 实现,频繁地创建、销毁线程非常影响性能,同时无限制地创建线程还可能导致 OOM,所以在 Java 领域使用场景就受限了。 要想有效避免线程的频繁创建、销毁以及 OOM 问题,就不得不提今天我们要细聊的,也是 Java 领域使用最多的 Worker Thread 模式。 Worker Thread 模式及其实现 Worker Threa

小强快跑~~ 396

Java线程之Worker Thread Pattern

Worker Thread Pattern的参与者:1. Client(委托人)参与者    Client参与者会建立Request参与者,并传给Channel参与者。2. Channel(通路)参与者    Channel参与者会从Client参与者获取Request参与者,传递给Worker参与者。3. Worker(工人)参与者    Worker参与者会从Chann

Derekjiang的笔记簿 3305

java多线程&&设计模式浅了解

一个进程就是一个正在运行的程序。线程就是进程中的执行单位。一个进程里可以有多个线程故而称之为多线程(一个线程只属于一个进程)。线程执行相当于去抢cpu执行的,当执行一个线程未执行完事可能下一个线程开始执行了。

BASK2311的博客 350

并发编程笔记——多线程设计模式

多线程设计模式

金牛区代码仔的博客 479

java多线程12种设计模式

1、Single Threaded Execution Pattern(单线程执行模式)

堆码时刻 4265

【并发编程神器】,Worker Thread模式

如何才能有效避免线程的频繁创建、销毁以及OOM? Java应用最多的就是Worker Thread模式(后文简称为 WT)。 如何实现WT? WT类比程序员的工作场景:办公室里的执行 OKR 的程序员们,如果产品需求池有任务了,大家一起分任务,需求池空了(有生之年基本不会空)就摸鱼。 画个示意图理解下,WT 中的 Worker Thread对应我们程序员,一个团队的程序员数量往往固定。 编程中如何模拟这种模式呢?容易想到用阻塞队列做需求池,然后创建固定数量的线程消费阻塞队列中的任务。这其实就是Ja.

JavaEdge全是干货的技术号 1969

Java创建多线程的四种方式以及优缺点

java有以下四种创建多线程的方式: 1:继承Thread类创建线程 2:实现Runnable接口创建线程 3:使用Callable和FutureTask创建线程 4:使用线程池,例如用Executor框架创建线程 DEMO代码: package thread; import java.util.concurrent.*; public class ThreadTes...

Venus's Blog 5万+

java多线程中的设计模式

在本文开始介绍多线程中的设计模式 1.Single Threaded Execution Pattern 同一时刻只允许一个线程操作 可以理解为串行操作  总结在多线程要访问的方法上加上synchronized关键字 2.Immutable Pattern 变量赋值一次后只能读取,不能改变 比喻  一夫多妻 总结 将多线程共享的变量用finnal 修饰

菜鸡旭旭 607

多线程如何设计?一对多/多对一/多对多

二、14个多线程设计模式。

zxf347085420的博客 1404
上一篇: JAVA多线程设计模式篇 8、Thread-Per-Message 模式——来,这就是你的任务
下一篇: JAVA多线程设计模式篇 10、Future 模式——兄弟,放一百二十个心,到时候来提货
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值