读书人

采取Java 5的ExecutorService实现线程

发布时间: 2012-12-20 09:53:21 作者: rapoo

采用Java 5的ExecutorService实现线程池

采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求。

1.服务端

?

# 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.*;     # import java.util.concurrent.*;     #     # public class MultiThreadServer {     #     private int port=8821;     #     private ServerSocket serverSocket;     #     private ExecutorService executorService;//线程池     #     private final int POOL_SIZE=10;//单个CPU线程池大小     #          #     public MultiThreadServer() throws IOException{     #         serverSocket=new ServerSocket(port);     #         //Runtime的availableProcessor()方法返回当前系统的CPU数目.     #         executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);     #         System.out.println("服务器启动");     #     }     #          #     public void service(){     #         while(true){     #             Socket socket=null;     #             try {     #                 //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接     #                 socket=serverSocket.accept();     #                 executorService.execute(new Handler(socket));     #                      #             } catch (Exception e) {     #                 e.printStackTrace();     #             }     #         }     #     }     #          #     public static void main(String[] args) throws IOException {     #         new MultiThreadServer().service();     #     }     #     # }     #     # class Handler implements Runnable{     #     private Socket socket;     #     public Handler(Socket socket){     #         this.socket=socket;     #     }     #     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));     #     }     #     public String echo(String msg){     #         return "echo:"+msg;     #     }     #     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"))     #                     break;     #             }     #         } catch (IOException e) {     #             e.printStackTrace();     #         }finally{     #             try {     #                 if(socket!=null)     #                     socket.close();     #             } catch (IOException e) {     #                 e.printStackTrace();     #             }     #         }     #     }     # } 

?

?2.客户端

   1. package sterning;        2.        3. import java.io.BufferedReader;        4. import java.io.IOException;        5. import java.io.InputStreamReader;        6. import java.io.OutputStream;        7. import java.net.Socket;        8. import java.util.concurrent.ExecutorService;        9. import java.util.concurrent.Executors;       10.       11. public class MultiThreadClient {       12.            13.     public static void main(String[] args) {       14.         int numTasks = 10;       15.                16.         ExecutorService exec = Executors.newCachedThreadPool();       17.       18.         for (int i = 0; i < numTasks; i++) {       19.             exec.execute(createTask(i));       20.         }       21.       22.     }       23.       24.     // 定义一个简单的任务       25.     private static Runnable createTask(final int taskID) {       26.         return new Runnable() {       27.             private Socket socket = null;       28.             private int port=8821;       29.       30.             public void run() {       31.                 System.out.println("Task " + taskID + ":start");       32.                 try {                           33.                     socket = new Socket("localhost", port);       34.                     // 发送关闭命令       35.                     OutputStream socketOut = socket.getOutputStream();       36.                     socketOut.write("shutdown\r\n".getBytes());       37.       38.                     // 接收服务器的反馈       39.                     BufferedReader br = new BufferedReader(       40.                             new InputStreamReader(socket.getInputStream()));       41.                     String msg = null;       42.                     while ((msg = br.readLine()) != null)       43.                         System.out.println(msg);       44.                 } catch (IOException e) {                           45.                     e.printStackTrace();       46.                 }       47.             }       48.       49.         };       50.     }       51. }   
?

?

从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况。

?

原文摘自:http://blog.csdn.net/flowerknight/archive/2009/06/14/4269052.aspx

?

?

读书人网 >编程

热点推荐