Reactor模型示例

Elsevier投稿实战:从ESWA模板到录用通知的全流程拆解 本文详细拆解了Elsevier旗下期刊ESWA(Expert Systems With Applications)的投稿全流程,从模板选择、投稿系统操作到审稿意见回复和录用后注意事项。重点分享了单栏LaTeX模板调整、APA文献格式处理、Highlights撰写技巧等实战经验,帮助研究者高效完成投稿并提升录用概率。 阅读详情

Reactor模型相关内容可参考:https://blog.youkuaiyun.com/skh2015java/article/details/106721630

Reactor模型示例
mainSelector 负责处理ACCEPT I/O事件,处理ACCEPT的业务逻辑Handler交给executorService线程池处理
subSelector负责处理READ I/O事件,处理READ和逻辑的Handler交给executorService线程处理

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;



public class ReactorTask {


    public static void main(String[] args) throws IOException {
        new ReactorTask().startReactor();
    }



    final int  PORT = 7786;
    final Selector  mainSelector;
    final Selector subSelector;
    final ServerSocketChannel serverSocketChannel;

    final Thread  subThread ;
    final ExecutorService executorService = Executors.newFixedThreadPool(8);

    private ConcurrentLinkedQueue <SocketChannel> socketChannels = new ConcurrentLinkedQueue<>();

    public ReactorTask() throws IOException {
        mainSelector = Selector.open();
        subSelector = Selector.open();

        subThread = new Thread(new SubThreadTask());

        serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.bind(new InetSocketAddress(PORT));

        serverSocketChannel.register(mainSelector, SelectionKey.OP_ACCEPT);
    }

    public void startReactor(){
        try{
            subThread.start();
            while (!Thread.interrupted()){
                mainSelector.select();  //阻塞等待ACCEPT事件
                Iterator<SelectionKey> it = mainSelector.selectedKeys().iterator();
                while (it.hasNext()) {
                    SelectionKey key=  it.next();
                    if (key.isAcceptable()) {
                        ServerSocketChannel server = (ServerSocketChannel)key.channel();
                        SocketChannel sc = server.accept();
                        executorService.execute(new ServerSocketChannelAcceptHandle(sc));
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    class SubThreadTask implements Runnable {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                       subSelector.select();
                        while (!socketChannels.isEmpty()){
                            SocketChannel socketChannel  = socketChannels.poll();
                            socketChannel.configureBlocking(false);
                            socketChannel.register(subSelector,SelectionKey.OP_READ);
                            ByteBuffer buffer = ByteBuffer.wrap("register success".getBytes());
                            socketChannel.write(buffer);
                        }


                    Iterator<SelectionKey> selectedKeys = subSelector.selectedKeys().iterator();
                    while (selectedKeys.hasNext()){
                        SelectionKey key =  selectedKeys.next();
                        if (!key.isValid()) {
                            break;
                        }
                        if (key.isReadable()){
                            executorService.execute(new SocketChannelReadHandle(key));
                        }
                    }
                } catch (Exception e) {
                    System.out.println("catch Exception "+ e);
                }
            }
        }
    }


    class SocketChannelReadHandle implements Runnable {

        private SelectionKey key;
        ByteBuffer buffer = ByteBuffer.allocate(128);

        public SocketChannelReadHandle(SelectionKey key){
            this.key = key;
        }

        @Override
        public void run() {
            try {
                if (!key.isValid()){
                    return;
                }
                SocketChannel channel = (SocketChannel)key.channel();
                buffer.clear();
                if ( channel.read(buffer) > 0 ){
                    buffer.flip();
                    System.out.println("handle Thread:"+Thread.currentThread().getName() +"  subReactor  read:"+Charset.forName("UTF-8").decode(buffer).toString() );
                    buffer.clear();
                    buffer.put("I am subReactor".getBytes());
                    buffer.flip();
                    channel.write(buffer);
                }
            } catch (Exception e) {
                System.out.println(" caught "+ e + " closing channel");
                try {
                        key.channel().close();
                } catch (Exception e1) {
                    System.out.println("caught" + e1 + "channel has closed ");
                }
            }
        }
    }


    class ServerSocketChannelAcceptHandle implements Runnable {
        private SocketChannel channel;

        public ServerSocketChannelAcceptHandle(SocketChannel channel){
            this.channel = channel;
        }


        @Override
        public void run() {
            try {
                socketChannels.offer(channel);
                subSelector.wakeup();
                System.out.println("handle Thread:"+Thread.currentThread().getName() + " mainReactor accept remoteAddr:"+ channel.getRemoteAddress().toString()+" and register over!");
            } catch (ClosedChannelException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}


 

 

【ROS2实体机械臂驱动】封装珞石ROS2驱动库ros2_rokae_driver_lib 这一篇文章将封装为,和之前一篇文章《ROS2 编译、打包、封装三方库(Knet为例)_ros插件编译成静态库-优快云博客》写的封装,区别在于优化了cmake dependencies和include等属性和宏定义,同时对于多库内部依赖的情况做了特定处理,更加方便外部调用。其中珞石的编译参考博主之前的文章rokae xCoreSDK C++测试使用,这里不再做赘述。通过这篇文章对于如何打包机械臂厂家提供的三方库做了进一步说明,方便用于不同机械臂厂家的三方库封装调用。!! 阅读详情

相关推荐

告别混乱!AutoSar BswM模式管理实战:手把手教你配置Rule与ActionList(附避坑指南)

本文详细解析了AutoSar BswM模式管理的实战配置,重点介绍了Rule与ActionList的高效组合方法,帮助开发者避免常见陷阱。通过具体案例演示了从基础到复杂的配置步骤,包括模式仲裁、逻辑表达式构建及ActionList优化策略,提升汽车电子系统的协调性与可靠性。

weixin_27066963的博客 260

Netty 线程模型分析(一) reactor 线程如何执行任务

reactor线程如何运行的呢?

anLA_的专栏 592

电源设计避坑指南:半桥LLC软启动的5个常见错误及解决方案

本文针对半桥LLC谐振变换器软启动过程中的五个常见设计错误,提供了详细的工程解决方案。重点分析了忽视谐振腔初始状态导致的电流冲击、软启动斜坡与环路带宽不匹配、开环到闭环切换时机不当、变压器偏磁以及参数未考虑边界条件等问题,并给出了包括主动预充电、自适应斜坡、最佳切换点判定等实用调试技巧,帮助工程师实现平稳可靠的电源启动。

weixin_29260291的博客 283

并发队列之ConcurrentLinkedQueue(非阻塞队列)

前言 常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞ConcurrentLinkedQueue是如何使用CAS实现的。 一、ConcurrentLinkedQueue简介 ConcurrentLinkedQueue是基于一个单向无界链表实现的无阻塞的无界队列。采用的是CAS非阻塞算法实现。无锁化。 ...

weixin_33947521的博客 459

西电微机系统课程设计步进电机开环控制系统

** 微机系统与应用课程设计 课题二 步进电机开环控制系统设计** 一、程设计目的 掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力。 加深对 A/D 和并行接口芯片的工作方式和编程方法的理解。 搞懂步进电机的工作原理及控制方式,掌握开环控制系统的设计思路和实现方法。 二、课程设计的内容 手动调节电位器旋钮(0V~5V),通过 ADC0809 模拟输入水库水位 0 米~50...

qq_37015775的博客 4040

解密UFS Explorer:Drobo BeyondRAID数据恢复实战指南

本文详细介绍了使用UFS Explorer Professional Recovery软件中的Drobo BeyondRAID助手进行数据恢复的完整实战流程。当Drobo设备因BeyondRAID配置信息丢失而无法访问时,该工具能安全、只读地扫描硬盘,虚拟重建存储池,帮助用户找回宝贵数据。指南涵盖了从前期准备、硬盘选择、配置扫描到数据安全导出的每一步关键操作与常见问题解决方案。

weixin_29219539的博客 270

Java IO编程全解(四)——NIO编程

  转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7793964.html    前面讲到:Java IO编程全解(三)——伪异步IO编程   NIO,即New I/O,这是官方叫法,因为它相对于之前的I/O类库是新增的。但是,由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O...

weixin_33671935的博客 211

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

Reactor模型

Reactor模型,是基于事件驱动的,通过一个或多个输入同时传递给服务端处理 服务端程序处理传入的多个请求,并分发到相应的处理线程

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 1万+

Android Framework AudioFlinge 面试题及参考答案

请解释什么是 AudioFlinger? AudioFlinger 是 Android 音频系统中的一个关键服务。它位于 Android 系统的中间层,是连接上层应用和底层音频硬件驱动的重要桥梁。从功能角度来讲,它主要负责音频数据的混合(Mix)以及输出(Output)。 当多个应用程序同时播放音频时,比如一个音乐播放器在播放歌曲,同时手机的闹铃响起,AudioFlinger 就会发挥它的混合功能。它会把这些不同来源的音频数据按照一定的规则和算法混合在一起。这种混合并不是简单的相加,而是要考

大模型大数据攻城狮的专栏 1577

[QMT量化交易小白入门]-二十八、有了回测年化收益好的策略,如何在QMT量化实盘呢(附python代码解析)

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 2927

Reactor模型详解

文章目录前言一、经典的同步阻塞模型二、单reactor单线程设计1.代码示例三、单reactor多线程设计四、多reactor多线程设计五、Reactor模型结构图总结 前言 说到NIO、Netty,Reactor模型一定是绕不开的,因为这种模式架构太经典了,但是好多人在学习的时候,往往会忽视基础的学习,一上来就是Netty,各种高大上,但是却没有静下心来好好看看Netty的基石——Reactor模型。本文就带着大家看看Reactor模型,让大家对Reactor模型有个浅显而又感性的认识。 一、经典的同

乐乐的博客 1万+

西门子G120变频器在立体仓库堆垛机应用参数设置

本文详细介绍了G120 CU240E及CU250S变频器的参数设置流程。主要内容包括:1)快速调试步骤,从新建项目、扫描节点到设置电机类型、负载类型等参数;2)抱闸参数设置方法;3)参数下载异常时的处理方案。重点说明了通过STARTER软件进行向导式调试的完整过程,包括电机铭牌参数输入、识别方式选择等关键环节,并提示了通讯连接注意事项。当下载失败时,提供了通过导入导出项目文件解决问题的具体方法。

xdpcxq的专栏 864

深入解析Netty的Reactor模型及其实现:详解与代码示例

Netty是一个高性能、异步事件驱动的网络应用框架,采用了Reactor模型来实现高并发处理。Reactor模型是处理多路复用I/O操作的一种设计模式,它可以在一个或多个线程中调度多个I/O事件。本文将详细介绍Netty的Reactor模型及其在代码中的实现。

微笑听雨 5426

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Netty代码示例及Reactor主从多线程模型

Netty

qq_38517570的博客 594

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Reactor 模型 vs Proactor 模型:区别与代码示例

本文介绍了两种io模型之间的区别

xunyiovo的博客 351

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

reactor 模型

reactor 模型 主要框架: 当有事件发生时,调用对应的回调函数(数据接受/发送,处理); reactor 会一直跑 run,即一直处在 epoll_wait 中等待事件的到来; 当有事件到来,会调用相应事件的回调函数(之前的事件注册); 以下例子利用reactor模型实现接受客户端消息,并将消息发回给客户端: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <s

WULI_LIN的博客 501

结合Thrift示例详解网络服务模型(多线程阻塞IO、多线程非阻塞IO、多Reactor模型)

网络服务模型 Thrift提供的网络服务模型:单线程、多线程、事件驱动,从另一个角度划分为:阻塞服务模型、非阻塞服务模型。 单线程阻塞IO Thrift的TSimpleServer就是单线程阻塞IO。 TSimpleServer的工作模式采用最简单的阻塞IO,实现方法简洁明了,便于理解,但是一次只能接收和处理一个socket连接,效率比较低。......

lovelife110的博客 1571

Reactor模型:网络线程模型演进

这是传统的JAVA网络编程方案所采用的线程模型。即有一个主循环,socket.accept阻塞等待,当建立连接后,创建新的线程/从线程池中取一个,把该socket连接交由新线程全权处理。这种方案优点即实现简单,缺点则是方案的伸缩性受到线程数的限制。// 循环监听// 阻塞监听客户端请求System.out.println(client.getRemoteSocketAddress() + "客户端连接成功!");// 将该客户端请求通过线程池放入HandlMsg线程中进行处理。

jiezheee的专栏 1272

【Netty】Reactor 模型(十)

Netty 概述(一)Netty 架构设计(二)Netty Channel 概述(三)Netty ChannelHandler(四)ChannelPipeline源码分析(五)字节缓冲区 ByteBuf (六)(上)字节缓冲区 ByteBuf(七)(下)Netty 如何实现零拷贝(八)Netty 程序引导类(九)说到 NIO、Netty,Reactor模型一定是绕不开的,因为这种模式架构太经典了,接下来我们就静下心来好好看看Netty的基石——Reactor模型。

DreamSun的博客 3472

NIO源码解析-Reactor线程模型

前言: 在我们进行网络编程中,为了应对海量的连接及IO处理,多数会采用一种叫做Reactor的处理模型。那么什么是Reactor模型呢?它有什么魔力来处理那么大量的客户端连接呢?与之前提到的NIO,它们是一回事吗? 1.Reactor组件 Reactor模型基于事件驱动。 什么是事件?客户端的连接、读写,这都可被称为事件。 在Reactor模型中定义了三种角色: 1.1 Acceptor 用于处理客户端的连接,并将连接分发到处理链中 1.2 R...

恐龙弟旺仔的博客 783

Reactor线程模型的实现

一、Selector&Channel 1.1:各种channel 写这个模型需要提前了解Selector以及Channel,之前记录过FileChannel,除此之外还有以下几种Channel: ServerSocketChannel:用于监听新的TCP连接的通道,负责读取&响应,通常用于服务端的实现。 SocketChannel:用于发起TCP连接,读写网络中的数据,通常用于客户端的实现。 DatagramChannel:上述两个通道基于TCP传输协议,而这个通道则基于UDP,用于读写网络

Java技术 766

Reactor线程模型

    在BIO时代,我们写一个服务端,由于其同步阻塞特性,我们采取的方式是这样的: 当服务端收到一个客户端请求后,不得不为这个客户端单独开一个线程来阻塞读取这个客户端后续发来的数据。如果学过多线程,我们很清楚,如果线程开多了是一件很糟糕的事情,过多的上线文切换,很耽误服务器的正常的工作。这也意味着这种模式的请求量瓶颈很低。故而在NIO应运而生,在NIO下服务端是这样的:     这种模式下,...

qq_30095631的博客 549

网络编程NIO之Reactor线程模型

Reactor线程模型单Reactor线程模型基于工作线程的Reactor线程模型多Reactor线程模型多Reactor线程模型示例 上篇文章中写了一些NIO相关的知识以及简单的NIO实现示例,但是示例中,客户端连接以及读取、写入、处理客户端数据时都是在一个线程中,单个线程处理客户端的数据,性能会很差,而且不能充分利用服务器的性能,这篇文章主要介绍Reactor线程模型,NIO的多路复用知识,用...

狐言 760

Netty 源码分析系列(十)Reactor 模型

说到 NIO、Netty,Reactor模型一定是绕不开的,因为这种模式架构太经典了,接下来我们就静下心来好好看看Netty的基石——Reactor模型。本文就带着大家看看 Reactor 模型,让大家对 Reactor 模型有个浅显而又感性的认识。

初念初恋的博客 1211

深入剖析Netty Reactor模型:解锁高并发编程的密钥

Netty的Reactor模型的工作原理解析

m0_73978383的博客 869
上一篇: Scalable IO in Java
下一篇: Kafka Client源码中的NIO使用
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值