Server端:
线程池:
client端以及task沿用上一篇
改进点:
由于线程池和消息队列都是有界的,无论客户端并发连接数有多大,都不会导致线程数过多或者线程栈溢出
package com.huayang.fakeasyncio;
import com.huayang.Bio.ServerHandler;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(10001);
System.out.println("server start in port 10001");
Socket socket = null;
ServerThreadExcutorPool singleExcutor = new ServerThreadExcutorPool(50, 1000);
while (true) {
socket = serverSocket.accept();
singleExcutor.execute(new ServerHandler(socket));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != serverSocket) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
线程池:
package com.huayang.fakeasyncio;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ServerThreadExcutorPool {
private ExecutorService executorService;
public ServerThreadExcutorPool(int maxPoolSize, int queneSize) {
executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
maxPoolSize, 120L, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(queneSize));
}
public void execute(java.lang.Runnable task) {
executorService.execute(task);
}
}
client端以及task沿用上一篇
改进点:
由于线程池和消息队列都是有界的,无论客户端并发连接数有多大,都不会导致线程数过多或者线程栈溢出