boss工作原理

源码跟踪结论:boss线程只是接收客户端socket并初始化客户端channle,,将channel注册到worker线程中。boss中不会做耗时的I/O读取,只是将channel丢给worker。

 

以下为我进行的代码追踪过程:

 

--->NettyServer.doOpen()

--->ServerBootstrap.bind(final SocketAddress localAddress)

--->ServerBootstrap.bindAsync(final SocketAddress localAddress)

--->NioServerSocketChannelFactory.newChannel(ChannelPipeline pipeline)

--->NioServerSocketChannel(

            ChannelFactory factory,

            ChannelPipeline pipeline,

            ChannelSink sink, Boss boss, WorkerPool<NioWorker> workerPool)构造函数

--->ServerSocketChannel.open()//打开ServerSocketChannel

……

--->NioServerSocketPipelineSink.eventSunk

---> NioServerSocketPipelineSink.handleServerSocket(e)

--> NioServerBoss------------boss的任务从这里开始

--->(NioServerBoss) channel.boss). bind(final NioServerSocketChannel channel, final ChannelFuture future,final SocketAddress localAddress)//这里boss就是初始化时将doOpen中的那一个boss赋值在了NioServerSocketChannel中,也就是下面调bind方法就是doOpen那边设置的boss去执行的

--->AbstractNioSelector.registerTask(new RegisterTask(channel, future, localAddress))

--->RegisterTask.run()

--->channel.socket.socket().bind(localAddress, channel.getConfig().getBacklog())//绑定address

--->channel.socket.register(selector, SelectionKey.OP_ACCEPT, channel);// 将这个通道channel注册到指定的selector中,返回一个SelectionKey对象实例。其实就是将serversocket注册到一个selector里面,实现NIO的异步IO处理   注:OP_ACCEPT:服务端请求连接客户端。

---> 调用AbstractNioSelector.registerTask ---selector.wakeup();//唤醒线程

---> AbstractNioSelector.run()

---> AbstractNioSelector.select(selector)// 可以选择已经准备就绪的通道,返回的int值表示有多少通道已经就绪 。比如对读就绪的通道感兴趣,那么select()方法就会返回读事件已经就绪的那些通道。

---> AbstractNioSelector.processTaskQueue();//是从taskQueue里面取任务,taskQueue里面取出来的是selector和ServerSocketChannel 以及某事件绑定的Runnable。

---> NioServerBoss.process(selector)// 在process方法里面是一个死循环,里面在不间断的等待客户端的连接,如果有客户端的连接,那么将会调用方法registerAcceptedChannel进行后续的处理。

 

    ---> NioServerBoss.process ----SelectionKey.attachment();//取出

channel.socket.register(selector, SelectionKey.OP_ACCEPT, channel)中的channel  注:channel是NioServerSocketChannel对象,其中的参数有ServerSocketChannel socket;Boss boss;WorkerPool<NioWorker> workerPool;ServerSocketChannelConfig  config;

---> NioServerBoss.process ---channel.socket.accept();//监听新进来的连接

accept()方法返回的时候,它返回一个包含新进来的连接的 SocketChannel。因此, accept()方法会一直阻塞到有新连接到达,Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道。

---> NioServerBoss.process ---registerAcceptedChannel(channel, acceptedSocket, thread)// 将新的连接注册到worker线程,让worker线程负责后续读写

--->到此boss的任务就结束了,boss主要用来监听socket请求,并把客户端的channel分发给worker去执行

即doOpen中的worker最后赋值给了AbstractNioWorkerPool中的workerExecutor变量,NioWorkerPool继承了AbstractNioWorkerPool,所以也可以调到workerExecutor变量。workers中存放 worker线程,即worker相当于doOpen中的worker,只不过workers为线程组。

bossExecutor值就是doOpen中的worker线程组,bosses存放的也是doOpen中的worker线程。NioServerBossPool继承AbstractNioBossPool,所以NioServerBossPool也可以调用这几个参数

最终NioServerSocketChannelFactory中存放了doOpen中的worker和boss

 

   所以最后等于把doOpen中的那一个boss线程和worker组放在了NioServerSocketChannel

这里就是 boss初始化时做的事情

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BOSS是一个游戏中的角色,acmer是玩家。在游戏中,acmer需要击败BOSS才能获胜。BOSS和acmer都有一套出招表,根据出招规律,他们会进行攻击和防守。如果acmer在被BOSS砍掉n滴血之前,能够砍掉BOSS m滴血,那么acmer就能赢得游戏。如果两者都不能赢,就输出"impossible"。\[3\] 根据给定的代码,我们可以看到,代码中使用了一个循环来判断acmer和BOSS的出招情况。如果acmer的出招和BOSS的出招相同,那么继续下一轮循环。如果acmer的出招加上BOSS的出招大于0,那么根据攻击系数的大小,决定是acmer还是BOSS受到伤害。如果acmer的血量小于等于0,那么输出"boss",表示BOSS获胜。如果BOSS的血量小于等于0,那么输出"acmer",表示acmer获胜。如果循环结束后,acmer和BOSS的血量都大于0,那么输出"impossible",表示无法确定胜负。\[2\] 综上所述,根据给定的出招表和规则,我们可以判断出acmer和BOSS谁能赢得游戏。 #### 引用[.reference_title] - *1* [设计模式 行为型模式 -- 备忘录模式 具体实例:游戏挑战BOSS](https://blog.csdn.net/I_r_o_n_M_a_n/article/details/121074782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [11153 kill boss](https://blog.csdn.net/weixin_30470857/article/details/96922334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值