Netty学习之路(2)
来源:互联网 发布:杭州大数据面授班 编辑:程序博客网 时间:2024/06/08 18:54
线程池处理
在Netty学习之路(1)中,使用的处理方式是每个客户端连接创建一个独立线程去处理的方式,这篇中,将采用线程池的处理方式。但由于也是堵塞式,所以也有存在大量的弊端。具体利弊这里就不再阐述,自行脑补或者找度娘谷哥。
上代码
server端:
package com.netease.bio_2;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/* * 线程池处理 * * */public class Server { public static void main(String[] args) { ServerSocket ss = null; try { ss = new ServerSocket(8888); System.out.println("服务器已启动:"); while(true){ ServerHandlePool pool = new ServerHandlePool(50, 100); Socket socket = ss.accept(); pool.execute(new ServerHandle(socket)); } } catch (IOException e) { e.printStackTrace(); } Runtime.getRuntime().addShutdownHook(new Thread(){ public void run(){ System.out.println("-----Hook execute ------"); } }); }}
线程池:
package com.netease.bio_2;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ServerHandlePool { private ExecutorService executor;public ServerHandlePool(int maximumPoolSize,int maxQueuesize){ executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maximumPoolSize, 120L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(maxQueuesize));}public void execute(Runnable task){ executor.execute(task);}}
客户端代码和服务器端处理类代码和(1)中没有变化,这里不再占用篇幅了。
这里简单说下核心代码:
new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maximumPoolSize, 120L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(maxQueuesize));
参照JDKAPI
构造方法:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
availableProcessors方法是向 Java 虚拟机返回可用处理器的数目。这里corePoolSize 就取处理器的数目。
说下 corePoolSize 和maximumPoolSize的含义
简单理解(没有考虑边界的情况):当线程数量小于corePoolSize 时,有新任务过来的时候就直接在线程池里创建。
当当前线程数不少于corePoolSize 时但是少于maximumPoolSize,则将线程放入队列中等待处理。也就是说线程队列满的时候,才会创建,但是,当corePoolSize 等于maximumPoolSize,那再来新线程就直接拒绝了。
这里就要谈到这个keepAliveTime,当一些任务执行完毕,进入空闲状态时,当超过keepAliveTime这个时间就会被释放出来。
BlockingQueue是一个接口,代码里使用的 ArrayBlockingQueue
查看API,有说明,copy一下
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。
2 0
- Netty学习之路(2)
- Netty学习之路(1)
- Netty学习开发之路
- Netty 学习(2)
- netty学习之路(一) netty+protocolbuffer 实现简单的消息发送
- Netty学习总结(2)——Netty的高性能架构之道
- nio学习之netty入门(2)---netty中handler的执行顺序
- Netty 之 netty源码学习之netty server端源码初读(上)
- Netty之 netty源码学习之netty server端源码初读(下)
- java-Netty学习(2)
- Netty学习之旅(一)
- netty 学习之bytebuf
- Netty学习之二
- Netty学习之三
- netty学习之ServerChannel
- netty学习之ChannelEvent
- Netty学习之旅------Netty Channel 概述
- 3、netty 之HelloWorld(netty学习笔记)
- 延迟X秒之后执行某段代码
- 滚动单元格到某处
- Python装饰器
- [mybatis]动态SQL与SQL片段
- Linux模块卸载
- Netty学习之路(2)
- HDU 1010 Tempter of the Bone 骨头的诱惑
- 一统江湖 | 微信的野心有多大?
- android 使用ViewDragHelper轻松实现DrawerLayout和SlidMenu侧滑效果
- 添加 MyEclipse Persistence Tools 类库
- 关于Johnson-Trotter和字典序排列在《算法设计与分析基础》中的论述
- Exposing Qt's Q_ENUMS to QML
- 4.16 Android 感应器实现摇一摇的功能
- Linux隐藏进程