1. 程式人生 > >使用自定義線程池優化EchoServer

使用自定義線程池優化EchoServer

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