文档章节

伪异步i/o模型

泡海椒
 泡海椒
发布于 2016/02/17 10:35
字数 393
阅读 15
收藏 0

伪异步i/o模型
采用线程池和队列可以实现一种叫做伪异步I/O通信框架
当有新的客户接入的时候,将客户端的socket封装成为一个task 投递到后端线程池中进行处理,jdk线程池维护一个消息队列和n个活跃线程对消息的任务进行处理,由于线程池可以设置消息队列
的大小和最大的线程总数,因此资源占用可控
package paohaijiao.netty.pseudoAsynchronous;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import paohaijiao.netty.bio.TimerServerHandler;

public class TimeServer {

    public static void main(String[] args) throws IOException {
        
        
        int port = 8080;
        if (args != null && args.length > 0) {
            port = Integer.valueOf(args[0]);
        }
        ServerSocket server = null;
        try {
            server=new ServerSocket(port);
            System.out.println("The timer server start in port:"+port);
            Socket socket=null;
            
            TimeServerHandlerExecutePool singelExecutor=new TimeServerHandlerExecutePool(50,1000);
            while(true){
                socket=server.accept();
                new Thread(new TimerServerHandler(socket)).start();
            }
            
            
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(server!=null){
                System.out.println("The timer server is close:");
                server.close();
                server=null;
                
            }
        }
        
        

    }

}
package paohaijiao.netty.pseudoAsynchronous;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TimeServerHandlerExecutePool {
    private ExecutorService executor;

    public TimeServerHandlerExecutePool(int maxPoolsize,int queenSize) {
        
        executor=new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
                maxPoolsize,120L,TimeUnit.SECONDS,
                new ArrayBlockingQueue<java.lang.Runnable>(queenSize)
                );

        
    }
    
    
    public void execute(java.lang.Runnable task){
        
        executor.execute(task);
    }
}

package paohaijiao.netty.bio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TimeClient {

    public static void main(String[] args) {

        int port = 8080;
        if (args != null && args.length > 0) {
            port = Integer.valueOf(args[0]);
        }

        Socket socket = null;
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            socket = new Socket("127.0.0.1", port);
            in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
            out.println("QUERY TIME ORDER");
            System.out.println("Send order 2 server succeed");
            String resp = in.readLine();
            System.out.println("Now is:" + resp);

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            if (out != null) {
                out.close();
                out = null;
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                socket = null;
            }

        }
    }

}

© 著作权归作者所有

共有 人打赏支持
泡海椒
粉丝 10
博文 279
码字总数 291526
作品 0
成都
程序员
网络-BIO-伪异步I/O

为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例...

xyh12344
2015/12/21
59
0
I/O模型与Java

原文已同步至http://liumian.win/2016/11/23/io-model-and-java/ 学习I/O模型之前,首先要明白几个概念: 同步、异步 阻塞、非阻塞 这几个概念往往是成对出现的,我们常常能够看到,等描述,正...

那只是一股逆流
2016/11/23
25
0
Netty 之传统 BIO、NIO 编程

说明 系列文章:http://www.jianshu.com/p/594441fb9c9e 本文完全参考自《Netty权威指南(第2版)》,李林峰著。 传统 BIO 编程是什么样的? 基本的网络编程模型是,即两个进程间相互通信,其...

被称为L的男人
2017/09/02
0
0
Java NIO 机制分析(一) Java IO的演进

一、引言 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员再开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要有以下一些问题: (1)没有数据缓冲区,I/O性能存在问题...

宸明
04/20
0
0
网络模型同步异步与I/O模型同步异步

理解 I/O模型的同步与异步 网络 I/O 的同步与异步跟网络模型的同步与异步不同。在网络 I/O 接口中,有阻塞、非阻塞、多路复用、信号驱动、异步I/O五中I/O模型。网络I/O分为俩步,第一步等待条...

sdoyuxuan
10/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

腾讯投资最高1.75亿美元正式进军菲律宾移动支付市场

菲律宾长途电话公司(PLDT)公司今日宣布,中国互联网巨头腾讯和私募股权公司KKR将获得该公司旗下金融科技公司Voyager Innovations的少数股权。 PLDT在一份声明中称:“腾讯和KKR最多将分别收...

linuxCool
16分钟前
1
0
正则介绍及grep/egrep用法

10月16日任务 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 扩展 把一个目录下,过滤所有*.php文档中含有eval的行 grep -r --include="*.php" 'eval' /data 正则介绍 正则就是一串有规律的字符...

hhpuppy
27分钟前
0
0
J2Cache 中使用 Lettuce 替代 Jedis 管理 Redis 连接

一直以来 J2Cache 都是使用 Jedis 连接 Redis 服务的。Jedis 是一个很老牌的 Redis 的 Java 开发包,使用很稳定,作者维护很勤勉,社区上能搜到的文章也非常非常多。算是使用范围最广的 Redi...

红薯
今天
11
0
一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
今天
1
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部