初探-----同步,异步,阻塞,非阻塞

来源:互联网 发布:微信开发必须80端口 编辑:程序博客网 时间:2024/06/07 17:07

一、有瑕疵,但是有趣的故事。有助于我们理解

这里写图片描述

二、不同模式下的系统交互图

A、同步阻塞模式
这里写图片描述
B、同步非阻塞模式
这里写图片描述
C、异步非阻塞模式
这里写图片描述

三、其他人的观点

A同学说:
这里写图片描述

B同学说:
这里写图片描述

四、代码示例

同步阻塞式I/O

//TimeServer.javaimport java.io.IOException;import java.net.ServerSocket;import java.net.Socket;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 time server is start in port : "+port);            Socket socket = null;            while(true){                socket = server.accept();                new Thread(new TimeServerHandler(socket)).start();            }        } finally {            // TODO: handle finally clause            if(server != null){                System.out.println("The time server close");                server.close();                server = null;            }        }    }}//TimeServerHandler.javaimport java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class TimeServerHandler implements Runnable{    private Socket socket;    public TimeServerHandler(Socket socket) {        // TODO Auto-generated constructor stub        this.socket = socket;    }    @Override    public void run() {        // TODO Auto-generated method stub        BufferedReader in = null;        PrintWriter out = null;        try {            in = new BufferedReader(new InputStreamReader(                    this.socket.getInputStream()));            out = new PrintWriter(this.socket.getOutputStream(),true);            String currentTime = null;            String body = null;            while(true){                body = in.readLine();                if (body == null)                    break;                System.out.println("The time server reveive order : "+body);                currentTime="QUERY TIME ORDER".equalsIgnoreCase(body)?new java.util.Date(                        System.currentTimeMillis()).toString():"BAD ORDER";                out.println(currentTime);            }        } catch (Exception e) {            // TODO: handle exception            if(in != null){                try {                    in.close();                } catch (Exception e2) {                    // TODO: handle exception                }            }            if(out != null){                out.close();                out = null;            }            if(this.socket !=null){                try {                    this.socket.close();                } catch (Exception e2) {                    // TODO: handle exception                }                this.socket = null;            }        }    }   }//TimeClient.javaimport java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class TimeClient {    public static void main(String[] args) {        int port = 8080;        if(args != null && args.length>0){            try {                port = Integer.valueOf(args[0]);            } catch (Exception e) {                // TODO: handle exception            }        }        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 (Exception e) {            // TODO: handle exception        }finally {            if(out != null){                out.close();                out = null;            }            if(in != null){                try {                    in.close();                } catch (Exception e2) {                    // TODO: handle exception                }                in = null;            }            if(socket != null){                try {                    socket.close();                } catch (Exception e2) {                    // TODO: handle exception                }                socket = null;            }        }    }}

伪异步式I/O

//TimeServer.javapackage WeiYiBu;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class TimeServer {    public static void main(String[] args) throws IOException {        int port = 8080;        if(args != null && args.length > 0){            try {                port = Integer.valueOf(args[0]);            } catch (Exception e) {                // TODO: handle exception            }        }        ServerSocket server =null;        try {            server = new ServerSocket(port);            System.out.println("The time server is start in port : "+port);            Socket socket = null;            TimeServerHandlerExecutePool singleExecute = new TimeServerHandlerExecutePool(50, 10000);            while(true){                socket = server.accept();                singleExecute.execute(new TimeServerHandler(socket));            }        } finally {            // TODO: handle finally clause            if(server != null){                System.out.println("The time server close");                server.close();                server = null;            }        }    }}//TimeServerHandlerExecutePool.javapackage WeiYiBu;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 queueSize) {        // TODO Auto-generated constructor stub        executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxPoolSize, 120L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueSize));    }    public void execute(Runnable task){        executor.execute(task);    }}//TimeClient.java和TimeServerHandler.java同上
原创粉丝点击