浏览 1700 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-22
最后修改:2009-01-19
...... 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秒后完成,这样服务端就能提供更好的性能/服务给客户端。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |