线程池优化BS结构
线程池优化BS结构
服务端代码的优化:基于TCP支持多个客户端通信#^e44c74修改
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建ServerSocket对象
ServerSocket ss = new ServerSocket(10000);
// 创建一个线程池,负责处理通信管道的任务
ThreadPoolExecutor pool = new ThreadPoolExecutor(16 * 2, 16 * 2, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
while(true) {
// 调用accept等待客户端连接
Socket accept = ss.accept();
System.out.println("有人上线了:" + socket.getRemoteSocketAddress());
// 把这个客户端对应的socket通信管道,交给一个独立的线程负责
pool.execute(new ServerReaderRunnable(socket));
}
}
}
服务端写数据的多线程代码:基于TCP支持多个客户端通信#^2d3f4f修改。
public class ServerReaderRunnable implements Runnable {
private Socket socket;
public ServerReaderRunnable(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
// 获取输入流对象
InputStream is = accept.getInputStream();
// 把原始的字节输入流包装称数据输入流
DataInputStream dis = new DataInputStream(is);
while(true) {
try {
// 使用数据输入流读取客户端发送过来的消息
String rs = dis.readUTF();
System.out.println(rs);
// 获取客户端的IP地址
System.out.println(accept.getRemoteSocketAddress());
} catch(Exception e) {
System.out.println(socket.getRemoteSocketAddress() + "离线了");
dis.close();
socket.close();
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}