使用自定義線程池優化EchoServer
阿新 • • 發佈:2018-03-04
private ide try sso server exce sta 客戶 finally
在上一篇文章中http://www.cnblogs.com/gosaint/p/8494423.html 我自定義了線程池ThreadPool。現在在我的EchoServer中使用自定義線程池去負責和客戶端的通訊,代碼如下所示:
package com.asiaInfo.caozg.ch_03.threadPool;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServerThread {
private int port = 8000;
private ServerSocket serverSocket;
private ThreadPool threadPool;//線程池
private static final int POOLSIZE=4;//單個CPU時的線程的數目
public EchoServerThread() throws IOException {
serverSocket = new ServerSocket(port);
//創建線程池
//Runtime.getRuntime().availableProcessors()獲取當前CPU的數目
threadPool=new ThreadPool(Runtime.getRuntime().availableProcessors()*POOLSIZE);
System.out.println("服務器啟動");
}
public void service() {
while (true) {
Socket socket = null;
try {
socket = serverSocket.accept(); //等待客戶連接
// 為每一個客戶端創建一個線程
threadPool.execute(new Handles(socket));//把與客戶端通信的任務交給線程池
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) throws IOException {
new EchoServerThread().service();
}
private class Handles implements Runnable {
private Socket socket;
public Handles(final Socket socket) {
this.socket = socket;
}
public String echo(String msg) {
return "echo:" + msg;
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
@Override public void run() {
try {
System.out.println("New connection accepted "
+ socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
pw.println(echo(msg));
if (msg.equals("bye")) //如果客戶發送的消息為“bye”,就結束通信
break;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
使用自定義線程池優化EchoServer