论坛首页 编程语言技术论坛

SingleThread,MutiThread and Thread Pool(3)

浏览 1700 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-22   最后修改:2009-01-19
C
接上上编著, 现在简单说说线程池服务端程序的实现。线程池服务端与多线程差不多,主要不同也是在于接收请求的循环:


 ......
 protected ExecutorService threadPool = Executors.newFixedThreadPool(10);
 ......

 while(! isStopped()){
         Socket clientSocket = null;
         try {
             clientSocket = this.serverSocket.accept();
         } catch (IOException e) {
             if(isStopped()) {
                 System.out.println("Server Stopped.") ;
                 return;
             }
             throw new RuntimeException(
                "Error accepting client connection", e);
         }
        
         this.threadPool.execute(
            new WorkerRunnable(clientSocket, "Thread Pooled Server"));
        
     }

......

public class WorkerRunnable implements Runnable{

    protected Socket clientSocket = null;
    protected String serverText   = null;

    public WorkerRunnable(Socket clientSocket, String serverText) {
        this.clientSocket = clientSocket;
        this.serverText   = serverText;
    }

    public void run() {
        try {
            InputStream input  = clientSocket.getInputStream();
            OutputStream output = clientSocket.getOutputStream();
            long time = System.currentTimeMillis();
            output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " +
                    this.serverText + " - " +
                    time +
                    "").getBytes());
            output.close();
            input.close();
            System.out.println("Request processed: " + time);
        } catch (IOException e) {
            //report exception somewhere.
            e.printStackTrace();
        }
    }
}


Java JDK1.5开始,里边的java.util.concurrent 实现的线程池。上边就创建了一个大小为10的线程池。相比于多线程服务端程序,这里是把一个socket连接封装成一个Runnable传给一个线程池来处理。在线程池里边由一个队列保存Runnable,当线程池里的一个线程空闲时,它就会出列一个Runnable并执行之。

用线程池,你可以控制服务端同时运行的最大线程数。当一个请求处理占用许多cpu,内存或者网络带宽时,如果同时处理多个请求,就会减低服务端的性能。所以你可以通过控制最大线程数,来减少服务端占用的资源,从而减低了资源不够用的风险(如OutOfMomery)。

如果有1000个请求,每个请求处理要1秒钟,要完成全部请求就要1000秒。如果每次同时只能处理10个请求,哪么第一个10个请求就会在10秒后完成。下一个10个请求就会在20秒后完成......只有最后的10个请求才会在1000秒后完成,这样服务端就能提供更好的性能/服务给客户端。

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics