采取Java 5的ExecutorService实现线程池
采用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