美文网首页
7 基于Selector+Channel+线程池的Timeser

7 基于Selector+Channel+线程池的Timeser

作者: 沉沦2014 | 来源:发表于2018-08-26 13:45 被阅读18次

基于Selector+Channel+线程池的Timeserver

public class TimeServer {
    private static ExecutorService executor;
    static {
        executor = new ThreadPoolExecutor(5, 10, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000));
    }
    public static void main(String[] args) throws IOException {
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.socket().bind(new InetSocketAddress(8080));
        ssc.configureBlocking(false);
        Selector selector = Selector.open();
        ssc.register(selector, ssc.validOps());
 
        while (true) {
            int readyCount = selector.select(1000);
            if(readyCount==0){
                continue;
            }
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectionKeys.iterator();
            while(keyIterator.hasNext()){
                SelectionKey selectionKey = keyIterator.next();
                if(selectionKey.isValid()){
                    //表示ServerSocketChannel
                    if(selectionKey.isAcceptable()){
                        ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
                        SocketChannel socketChannel = server.accept();
                        socketChannel.configureBlocking(false);
                        socketChannel.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE);
                    }
 
                    //表示SocketChannel
                    if(selectionKey.isReadable()){
                        executor.submit(new TimeServerTask(selectionKey));
                    }
                    keyIterator.remove();
                }
            }
        }
    }
}
public class TimeServerTask implements Runnable{
    private SelectionKey selectionKey;
 
    public TimeServerTask(SelectionKey selectionKey) {
        this.selectionKey = selectionKey;
    }
 
    @Override
    public void run() {
        SocketChannel channel = (SocketChannel) selectionKey.channel();
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
        try {
            int count =0;
            while ((count = channel.read(byteBuffer)) > 0) {
                byteBuffer.flip();
                byte[] request=new byte[byteBuffer.remaining()];
                byteBuffer.get(request);
                String requestStr=new String(request);
                byteBuffer.clear();
                if (!"GET CURRENT TIME".equals(requestStr)) {
                    channel.write(byteBuffer.put("BAD_REQUEST".getBytes()));
                } else {
                    byteBuffer.put(Calendar.getInstance().getTime().toLocaleString().getBytes());
                    byteBuffer.flip();
                    channel.write(byteBuffer);
                }
            }
 
        } catch (IOException e) {
            e.printStackTrace();
            selectionKey.cancel();
        }
    }
}

这段代码的实现中:

  1. 把Channel的就绪选择放在了主线程(Acceptor线程)中来处理(等待数据准备阶段)
  2. 而真正的读取请求并返回响应放在了线程池中提交一个任务来执行(处理数据阶段)
    真正意义上实现了一个线程服务于多个client
    TimeClient直接使用上一节的即可

相关文章

  • 7 基于Selector+Channel+线程池的Timeser

    基于Selector+Channel+线程池的Timeserver 这段代码的实现中: 把Channel的就绪选择...

  • CompletableFuture快速指南

    CompletableFuture抛弃了JDK7及以前的基于线程池的异步任务,而是CompletableFutur...

  • 线程池

    线程池基础概念 线程池是什么 线程池是一种基于池化思想的线程管理工具 线程池解决了哪些问题 降低资源消耗(操作系统...

  • 从简单代码入手,分析线程池原理

    一、线程池简介 1、池化思想 在项目工程中,基于池化思想的技术应用很多,例如基于线程池的任务并发执行,中间件服务的...

  • ThreadPoolExecutor的内部工作原理

    一、初始化一个线程池 基于ThreadPoolExecutor类初始化一个指定线程数的线程池线程池 二、提交任务 ...

  • Java线程池实现原理及应用

    [toc] 概念 线程池是什么 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程...

  • 可动态调节参数的线程池实现

    背景 线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。...

  • 线程池原理及实践

    向Doug Lea大佬致敬 什么是线程池 线程池(Thread Pool)是一种基于池化思想管理线程的工具 为什么...

  • Java线程池

    基本原理 线程池基本常识 线程池(Thread Pool)是一种基于池化思想管理线程的工具。线程频繁的创建、销毁会...

  • 聊聊动态线程池的9个场景

    大家好,我是小马哥。 线程池是一种基于 池化思想管理线程 的工具,使用线程池可以减少 创建销毁线程的开销,避免线程...

网友评论

      本文标题:7 基于Selector+Channel+线程池的Timeser

      本文链接:https://www.haomeiwen.com/subject/tfqoiftx.html