SingleThread,MutiThread and Thread Pool(2)

接上上编著, 现在简单说说多线程服务端程序的实现。多线程服务端与单线程最主要的不同地方在于接收请求的循环:
[code]
......
public void run(){
synchronized(this){
this.runningThread = Thread.currentThread();
}
openServerSocket();

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);
}
try {

new Thread(
new WorkerRunnable(
clientSocket, "Multithreaded Server")
).start();

} catch (IOException e) {
//log exception and go on to next request.
}
}

System.out.println("Server Stopped.");
}


......
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]

由上代码可知,当某个处理请求时间太长时,并不会阻塞总个服务端(除非处理请求的占用全部的cpu,或者占用全部的带宽资源)。服务端可以花更少时间在serverSocket.accept()的调用上。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值