Reactor实战,创建一个简单的单线程Reactor(理解了就相当于理解了多线程的Reactor)

单线程Reactor

package org.example.utils.echo.single;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;public class EchoServerReactor implements Runnable{Selector selector;ServerSocketChannel serverSocketChannel;EchoServerReactor() throws IOException {//Reactor初始化selector = Selector.open();serverSocketChannel = ServerSocketChannel.open();InetSocketAddress address =new InetSocketAddress("localhost",8848);//非阻塞serverSocketChannel.configureBlocking(false);//分步处理,第一步,接收accept事件SelectionKey sk =serverSocketChannel.register(selector,0,new AcceptorHandler());// SelectionKey.OP_ACCEPTserverSocketChannel.socket().bind(address);System.out.println("服务端已经开始监听:"+address);sk.interestOps(SelectionKey.OP_ACCEPT);}@Overridepublic void run() {try {while (!Thread.interrupted()){selector.select();Set<SelectionKey>  selected=selector.selectedKeys();Iterator<SelectionKey> it=selected.iterator();while (it.hasNext()){SelectionKey sk=it.next();dispatch(sk);}selected.clear();}} catch (IOException e) {throw new RuntimeException(e);}}private void dispatch(SelectionKey sk) {Runnable handler=(Runnable) sk.attachment();if (handler!=null){handler.run();}}class AcceptorHandler implements Runnable{@Overridepublic void run() {try {SocketChannel channel=serverSocketChannel.accept();if (channel!=null)new EchoHandler(selector,channel);} catch (IOException e) {throw new RuntimeException(e);}}}public static void main(String[] args) throws IOException {new Thread(new EchoServerReactor()).start();}
}
package org.example.utils.echo.single;import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;public class EchoHandler implements Runnable{final SocketChannel channel;final SelectionKey sk;final ByteBuffer byteBuffer=ByteBuffer.allocate(1024);static final int RECIEVING=0,SENDING=1;int state=RECIEVING;EchoHandler(Selector selector,SocketChannel c) throws IOException {channel=c;c.configureBlocking(false);sk=channel.register(selector,0);sk.attach(this);sk.interestOps(SelectionKey.OP_READ);selector.wakeup();}@Overridepublic void run() {try {if (state==SENDING){channel.write(byteBuffer);byteBuffer.clear();sk.interestOps(SelectionKey.OP_READ);state=RECIEVING;}else if (state==RECIEVING){int length=0;while ((length=channel.read(byteBuffer))>0){System.out.println(new String(byteBuffer.array(),0,length));}byteBuffer.flip();sk.interestOps(SelectionKey.OP_WRITE);state=SENDING;}} catch (IOException e) {throw new RuntimeException(e);}}
}

结果:

原理无非就是:

多线程,无非就是搞多个Reactor   ,   一个专门接受accept  ,  一个专门dispatch ,  再搞一个多线程池处理handle

这里面最主要的就是

handle类,sk.attach(this);把对象传回reactor

参考文献:

java高并发核心编程. 卷1,NIO、Netty、Redis、ZooKeeper  (尼恩)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Presto:基于内存的OLAP查询引擎

PrestoSQL查询引擎 1、Presto概述1.1、Presto背景1.2、什么是Presto1.3、Presto的特性2、Presto架构2.1、Presto的两类服务器2.2、Presto基本概念2.3、Presto数据模型3、Presto查询过程3.1、Presto执行原理3.2、Presto与Hive3.3、Presto与Impala3.4、PrestoDB与PrestoSQL4、Pre…

云安全技术包括哪些?

云安全技术是随着云计算技术的发展而衍生出来的一种安全技术&#xff0c;它利用云计算的分布式处理和数据存储能力&#xff0c;实现对海量数据的快速处理和存储&#xff0c;同时采用机器学习和人工智能技术对数据进行分析和挖掘&#xff0c;以便更好地发现和防御安全威胁。云安…

视频后期特效处理软件 Motion 5 mac中文版

Motion mac是一款运动图形和视频合成软件&#xff0c;适用于Mac OS平台。 Motion mac软件特点 - 精美的效果&#xff1a;Motion提供了多种高质量的运动图形和视频效果&#xff0c;例如3D效果、烟雾效果、粒子效果等&#xff0c;方便用户制作出丰富多彩的视频和动画。 - 高效的工…

ERP软件定制开发对企业的优势|app小程序搭建

ERP软件定制开发对企业的优势|app小程序搭建 随着科技的不断发展&#xff0c;企业管理也面临了更多的挑战。为了更好地适应市场需求和提高运营效率&#xff0c;越来越多的企业开始选择使用ERP软件进行管理。然而&#xff0c;市场上现成的ERP软件并不能完全满足企业的需求&#…

MySQL数据库与其管理工具Navicat

这里介绍MySQL数据库和Navicat的使用 1.下载MySQL数据库及MySQL客户端管理工具Navicat 登录www.mysql.com下载MySQL 登录www.navicat.com.cn/download下载客户端管理工具 2.启动MySQL数据库服务器 以管理员身份打开命令提示窗口 找到mysql的bin目录 输入初始化命令mysqld…

ESP32 LVGL Gui-Guider的移植

使用参考&#xff1a; ESP32系列之LVGL&#xff08;三&#xff09;&#xff1a;Gui-Guider的使用_esp32 lvgl-CSDN博客 1、拷贝文件&#xff1a; 按照上面的文章&#xff0c;使用Gui-Guider软件生成C代码之后&#xff0c;custom和generated是我们要使用到的文件&#xff0c;…

Python自动化测试通过日志3分钟定位bug

一、简单使用 入门小案例 1 2 3 4 5 6 7 8 import logging logging.basicConfig(levellogging.DEBUG, #设置级别&#xff0c;根据等级显示 format%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s) # 设置输出格式 logging.debug(This is a…

mfc140.dll丢失的解决方法,以及解决方法的优缺点

如果你在使用电脑时遇到了“mfc140.dll丢失”的错误提示&#xff0c;这可能会阻止你运行特定的应用程序或游戏。这篇文章将向你介绍导致此错误出现的原因以及mfc140.dll丢失的解决方法&#xff0c;让你的电脑系统恢复正常运行。 一.mfc140.dll丢失的解决方法以及优缺点 方法 1…

Java API接口强势对接:构建高效稳定的系统集成方案

文章目录 1. Java API接口简介2. Java API接口的优势2.1 高度可移植性2.2 强大的网络通信能力2.3 多样化的数据处理能力 3. 实战&#xff1a;Java API接口强势对接示例3.1 场景描述3.2 用户管理系统3.3 订单处理系统3.4 系统集成 4. 拓展&#xff1a;Java API接口在微服务架构中…

07-原型模式-C语言实现

原型模式&#xff1a; Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.&#xff08;用原型实例指定创建对象的种类&#xff0c; 并且通过拷贝这些原型创建新的对象。 &#xff09; UML图&#xff1…

SSM项目实战-登录验证成功并路由到首页面,Vue3+Vite+Axios+Element-Plus技术

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/sysUser.js import request from "../util/request.js";export const login (…

IoT DC3 是一个基于 Spring Cloud 全开源物联网平台 linux docker部署傻瓜化步骤

如有不了解可先参考我的另一篇文章本地部署:IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤 如有不了解可先参考我的另一篇文章本地部署: 1 环境准备: JDK 8 以上 docker 安装好 下载docker-compose-dev.yml 文件 执行基础环境docker安装 …

数据库管理-第119期 记一次迁移和性能优化(202301130)

数据库管理-第119期 记一次迁移和性能优化&#xff08;202301130&#xff09; 1 迁移 之前因为DV组件没有迁移成功的那个PDB&#xff0c;后来想着在目标端安装DV组件迁移&#xff0c;结果目标端装不上&#xff0c;而且开了SR也没看出个所以然来。只能换一个方向&#xff0c;尝…

go elasticsearch 测试实例

// 查询列表数据 func QueryOperateList(ctx context.Context, esClient *elastic.Client, index string, pageNum, pageSize int, start, end int64, execSql string, list []interface{}, operateAccount string, operateAddr string, maxRows, minRows int, dbAddr, namespa…

在re:Invent大会上,上汽海外出行选择亚马逊云科技为其提供智能网联解决方案

亚马逊云科技在re:Invent 2023上宣布&#xff0c;中国最大的汽车制造商之一、《财富》世界500强企业上汽集团旗下的上汽海外出行科技有限公司&#xff08;以下简称“上汽海外出行”&#xff09;已选择亚马逊云科技为重要云服务供应商&#xff0c;为出海的自主品牌汽车构建领先的…

解决webpack打包生成gz格式css/js文件没法在nginx使用的问题--全网唯一正确

本文绝对是全网解决这个问题唯一正确的文章&#xff0c;没有之一&#xff01; 很多人都说开启nginx gzip压缩&#xff0c;这些人完全是胡说八道&#xff01;你们到底懂不懂叫gzip压缩啊&#xff1f;&#xff01; 不信你就试试&#xff0c;如果css/js只有gz文件&#xff0c;ng…

Linux 系统渗透提权-Server2204-(解析)

B-3:Linux 系统渗透提权 任务环境说明: 服务器场景:Server2204(关闭链接) 用户名:hacker 密码:123456 1.使用渗透机对服务器信息收集,并将服务器中 SSH 服务端口号作为 flag 提 交; Flag:2283/tcp

Angular 由一个bug说起之三:为什么时不时出现额外的水平/垂直滚动条?怎样能更好的防止它的出现?

目录&#xff1a; 什么是单元溢出 控制滚动条出现的属性 怎样能减少意外的滚动条出现 一、什么是单元溢出 在说到这个问题之前我们先简单阐述一下视图窗口(Viewport)和视图内容(View Content) 视图窗口简单来说就是呈现内容的视口&#xff0c;浏览器就是一个窗口&#xff…

论ChatGPT让程序员提升效率—掌握时代工具风口修炼之道【文末送书-02】

文章目录 一.论ChatGPT让程序员提升效率—掌握时代工具风口修炼之道二.ChatGPT在代码编写中的应用2.1 快速解决问题&#xff1a;2.2 优化代码结构&#xff1a;2.3 ChatGPT的学习过程2.4 ChatGPT的自定义训练 三.文末推荐与福利免费包邮送出4本&#xff01;3.2领书方式 一.论Cha…

RflySim | 姿态控制器设计实验二

本实验的目的是让多旋翼的姿态能够跟随我们给定的期望姿态&#xff0c;姿态控制器的好坏直接决定了多旋翼能否平稳飞行。 RflySim| 姿态控制器设计实验二 01 基础实验 1.复现四旋翼飞行器的Simulink仿真&#xff0c;分析控制分配器的作用&#xff1b; 2.记录姿态的阶跃响应&a…