一、有瑕疵,但是有趣的故事。有助于我们理解
二、不同模式下的系统交互图
A、同步阻塞模式
B、同步非阻塞模式
C、异步非阻塞模式
三、其他人的观点
A同学说:
B同学说:
四、代码示例
同步阻塞式I/O
//TimeServer.java
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){
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.java
import 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.java
import 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.java
package 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.java
package 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同上