SingleThread,MutiThread and Thread Pool(3)

接上上编著, 现在简单说说线程池服务端程序的实现。线程池服务端与多线程差不多,主要不同也是在于接收请求的循环:

[code]

......
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();
}
}
}
[/code]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值