文档章节

伪异步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
Cent os 下 libevent,greenlet,gevent 的安装 和介绍 记录

libevent libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用 select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent base...

G0561
2014/04/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6 取整除法

python3.6 中取整除法运算逻辑如下: d 非零,那么商 q 满足这样的关系: a = qd + r ,且0 ≤ r n1=7//3#7 = 3*2 +1n2=-6.1//3#-7 = 3*(-3)+2'{},{}'.format(n1,n2) 从运行结果可以...

colinux
21分钟前
3
0
阶段总结——用虚拟机搭建一个高可用负载均衡集群架构

[toc] linux基本知识已经介绍完,现有一个业务需要操作,通过对这个项目的操作,可以复习、总结、巩固之前的知识点; ** 用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,...

feng-01
25分钟前
0
0
mysql 设置utf8字符集 (CentOS)

1.查看数据库及mysql应用目前使用的编码方式 (1)链接mysql 客户端 (2)执行:status 结果: 2.修改mysql 应用的字符编码(server characterset ) (1)打开配置文件:vim /etc/mysql/my...

qimh
25分钟前
0
0
windows无法格式化u盘解决方法

1。点开始-运行-输入cmd-format f: /fs: fat32 (这里f:是指U盘所在盘符) 这个格式化会很慢 请耐心等待

大灰狼wow
36分钟前
0
0
MySql 8.0连接失败

原来,MySql 8.0.11 换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password)。而客户端工具Navicat Premium12 中找不到新的身份验证插件(caching_s...

放飞E梦想O
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部