单线程 与 多线程 的执行

public class SingleThreadWebServer {
	public static void main(String args) throws IOException {
		ServerSocket socket = new ServerSocket(80);
		while (true) {
			Socket connection = socket.accept();
			handleRequest(connection);
		}

	}

	private static void handleRequest(Socket connection) {
		System.out.println("do something");
	}
}

public class MultipleThreadWebServer {

	public static void main(String args[]) throws IOException {
		ServerSocket socket = new ServerSocket(80);
		while (true) {
			final Socket connection = socket.accept();

			Runnable runable = new Runnable() {

				public void run() {
					handleRequest(connection);
				}
			};
			new Thread(runable).start();

		}

	}

	private static void handleRequest(Socket connection) {
		System.out.println("do something");
	}
}

          SingleThreadWebServer很简单,且在理论上是正确的,但在实际生产环境中的执行性能却很槽糕,

因为它每次只能同时处理一个请求。主线程在接受连接域处理相关请求等操作之间不断地交替运行。当服

务器正在处理请求时,新到来的连接不许等待知道请求处理完成,然后服务器将再次调用accept。

        MultipleThreadWebServer在结构上类似域前面的单线程版本-主线程仍然不断地交替执行“接受外部链接”

与”分发请求“ 等操作。区别于,对于每个连接,主线程都将创建一个新的线程来处理请求,而不是在祝循环

中进行处理。


        基于Executor来构建web服务器是非常容易的。在程序中用Executor代替了硬编码的线程创建过程。在

这种情况下使用了一种标准的Executor实现,即一个固定长度的线程池,可以容纳100个线程。

public class TaskExcecutionWebServer {
	
	private static final int NTHREADS= 100;
	private static final Executor exe = 
			Executors.newFixedThreadPool(NTHREADS);
	
	public static void main(String args[]) throws IOException{
		ServerSocket socket =new ServerSocket(80);
		
		while(true){
			final Socket connection = socket.accept();
			Runnable task =new Runnable() {
				
				public void run() {
				    handleRequest(connection);
					
				}
			};
			exe.equals(task);
		}
				
	}
	
}
在TaskExecutionWebServer中,通过使用Executor,将请求处理任务的提交域实际记性解耦开来,并且只需采用另一种

不同的Executor实现,就可以改变服务器的行为。改变Executor实现或配置所带来的影响要远远小于改变任务提交方式带来

的影响。通常,Executor的配置是一次性的,因此在不熟阶段可以完成,而提交任务的代码会不断地扩散到整个程序中,

增加了修改的难度。


public static ThreadPerTaskExecutor implements Executor {

   public void execute(Runnable r){

     new Thread(r).start();

}

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值