工作区(核心)
public class Channel {
//允许最多请求数
private static final int MAX_REQUEST = 100;
//请求容器
private final Request[] requestQueue;
private int tail; // 下一个putRequest的地方
private int head; // 下一个takeRequest的地方
private int count; // Request的数量
//工作线程组
private final WorkerThread[] threadPool;
public Channel(int threads) {
//初始请求容器
this.requestQueue = new Request[MAX_REQUEST];
this.head = 0;
this.tail = 0;
this.count = 0;
//初始化工作线程组
threadPool = new WorkerThread[threads];
for (int i = 0; i < threadPool.length; i++) {
threadPool[i] = new WorkerThread("Worker-" + i, this);
}
}
//工作线程开始工作
public void startWorkers() {
for (int i = 0; i < threadPool.length; i++) {
threadPool[i].start();
}
}
//添加请求
public synchronized void putRequest(Request request) {
//当容器缓冲请求数大于容器容量时等待
while (count >= requestQueue.length) {
try {
wait();
} catch (InterruptedException e) {
}
}
requestQueue[tail] = request;
//获取下一次放入请求的位置
tail = (tail + 1) % requestQueue.length;
count++;
notifyAll();
}
//处理请求
public synchronized Request takeRequest() {
//当请求数为空时等待
while (count <= 0) {
try {
wait();
} catch (InterruptedException e) {
}
}
Request request = requestQueue[head];
//获取下一次获取请求的位置
head = (head + 1) % requestQueue.length;
count--;
notifyAll();
return request;
}
}
请求对象
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) {
}
}
public String toString() {
return "[ Request from " + name + " No." + number + " ]";
}
}
工作线程
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 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) {
}
}
}
测试类
public class Main {
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();
}
}
1.启动线程是繁重的操作
如果可以把自己的工作交给别人做,自己的可以去做其他事情.线程也一亲.如果可以把工作交给其他线程,自己就可以继续进到下一个工作.这是Thread-Per-Message Pattern 的主题.
2.控制承载量
Worker Thread 还有一个主题.就是承载量的控制.
Worker 参与者的数量可以根据设置大小.
3. invocation(启动方法)与execution(执行方法)分离
提高响应性
控制实行顺序
可取消和可重复执行
分散处理的第一步
分享到:
相关推荐
进程多进程数值模式消费监听双向 表内存表记录出错次数与时间 无限扩展连结类型 无限扩展预设类型 双向支持 Rabbitmq MySQL的 Redis api开发 ...(待扩展) 初步支持 钉钉趾 邮件纠正 ...(待扩展) 架构图 初步...
"dl_woker-server"是一个基于JavaScript的服务器端项目,它可能是用于数据下载或者处理工作的工具。从项目名称来看,"dl"可能代表“download”(下载),而"worker"通常指的是在后台执行任务的工作进程,"server"则...
在Web开发领域,Service Worker是一种先进的技术,它允许开发者在浏览器后台运行脚本,独立于网页主线程,实现离线缓存、消息推送、网络代理等功能。在"购物车(Service worker)"这个示例中,我们将会探讨如何利用...
java版直播间源码 SIMVISO 源码解读分享系列: ...Rxjava中create方法的设计思想: 05 Observables和Observable.cache(): 06 无休止数据流与定时控制: 07 Demo的设计初衷: 08 Observable.cache()源
C语言程序设计-职工信息管理系统设计(链表) 本文档是关于C语言程序设计的职工信息管理系统设计实验报告,实验的目的是为了让学生进一步理解和掌握课堂上所学的各种基本抽象数据类型的逻辑结构、存储结构和操作...
"Web Worker版调用Face-Api.js"是一个解决方案,它利用Web Worker技术来封装并异步执行Face-API.js库,从而避免阻塞主线程,提供高性能的用户体验。以下是关于这个主题的详细知识点: 1. **Web Worker**:Web ...
WebWorkers是HTML5引入的一种多线程解决方案,它允许在浏览器后台独立于主线程运行脚本,处理密集型计算任务,避免阻塞用户界面。"brace-worker-loader"的作用就是将ACE编辑器的代码解析和高亮工作转移到WebWorker中...
**PWA(渐进式网页应用)与Service Worker** PWA(Progressive Web App)是一种新兴的Web开发技术,旨在提供接近原生应用的用户体验。它通过一系列技术,如Service Worker、Web App Manifest等,使得网页应用可以在...
1.前端控制器接收请求 2.前端控制器调用HandlerMapping(处理器映射器)根据url查找Handler 3.调用处理器适配器执行Handler,得到
用于《vue3中使用Web Worker多线程》这篇文章的项目Demo下载 文章地址:https://blog.csdn.net/weixin_42063951/article/details/125300644
7.1 打开一个FileChannel 7.2 从FileChannel通道中读取数据 7.3 向FileChannel中写入数据: 7.4 关闭FileCha
1.1 1、MySQL 的复制原理以及流程 (1)、复制基本原理流程 ... 程只做coordinator,只负责把relay log 中的binlog 读出来然后交给worker 线程, woker 线程负 责具体binlog event 的执行 更多面试题,请下载附件......
两个通道之间传输数据的方式有两种,分别是:FileChannel 的transferFrom()方法可以将数据从源通道传输到FileChannel中(这个方法在
- **多光标和多选**:允许同时编辑多个位置,提高了编辑的灵活性。 - **主题支持**:提供多种预设主题,用户也可以自定义编辑器的主题颜色。 - **实时协作**:可以集成到实时协作系统中,允许多人同时编辑同一份...
摘要:现在看的代码版本还是3.2.2develop。先看张内部结构代码图: 从依赖层次再来看,越是被依赖的,越在底层: rocketmq包含9个子模块: roc
云任务执行框架 ...调度器: 命令行界面:FrontEndScheduler -s -lw N_threads -rw PORT:服务器套接字的开放端口号-lw:本地工作模式N_threads:本地woker线程数-rw:远程工作者模式*注意:通过 -lw 或 -rw
因为我正在编写很多使用这种队列的小服务。 它只是一个轻量级的包装器(如果出于某种奇怪的原因您希望使用这个项目,我会改为直接使用该库),默认为持久队列并在连接失败时自动重新连接。 概要 var rabbitWorker ...
修剪器Felippe Regazio 的简单“纯客户端”视频修剪器演示地址: : 了解更多它实现了一个JS Web Worker,一个ffmpeg.js(Emscripten Port)和一个React App,可直接在客户端上对没有后端的视频进行剪切和切片。...
SDIS-FEUP启动初始数据库对等方,运行以下命令: # WINDOWS:java -cp out \p roduction \S DIS-FEUP Main Database 1024# LINUX/UNIX:java -cp out/production/SDIS-FEUP Main Database 1024添加更多数据库对等体 # ...
shellWorker SSJS 模块 shellWorker 模块使用 SystemWorker 来促进 shell 命令的执行。 更多信息 您可以使用安装 shellWorker。 至少需要 Wakanda 10。