Java ExecutorService 线程池

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

服务器端:

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();     
            }     
        }     
    }     
}   


客户端:


import java.io.BufferedReader;     
import java.io.IOException;     
import java.io.InputStreamReader;     
import java.io.OutputStream;     
import java.net.Socket;     
import java.util.concurrent.ExecutorService;     
import java.util.concurrent.Executors;     
    
public class MultiThreadClient {     
         
    public static void main(String[] args) {     
        int numTasks = 10;     
             
        ExecutorService exec = Executors.newCachedThreadPool();     
    
        for (int i = 0; i < numTasks; i++) {     
            exec.execute(createTask(i));     
        }     
    
    }     
    
    // 定义一个简单的任务     
    private static Runnable createTask(final int taskID) {     
        return new Runnable() {     
            private Socket socket = null;     
            private int port=8821;     
    
            public void run() {     
                System.out.println("Task " + taskID + ":start");     
                try {                         
                    socket = new Socket("localhost", port);     
                    // 发送关闭命令     
                    OutputStream socketOut = socket.getOutputStream();     
                    socketOut.write("shutdown/r/n".getBytes());     
    
                    // 接收服务器的反馈     
                    BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));     
                    String msg = null;     
                    while ((msg = br.readLine()) != null)     
                        System.out.println(msg);     
                } catch (IOException e) {                         
                    e.printStackTrace();     
                }     
            }     
        };     
    }     
}   

你可能感兴趣的:(java)