单线程 与 多线程 的执行
2013-02-19 14:09
218 查看
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(); } }
相关文章推荐
- 多线程和单线程的执行效率问题
- 多线程和单线程的执行效率问题
- 多线程和单线程的执行效率问题
- 多线程和单线程执行效率比较
- asp.net利用多线程执行长时间的任务,客户端显示出任务的执行进度的示例
- iOS多线程_获取线程队列执行完毕的信号
- 多线程执行时为什么调用的是start()方法而不是run()方法
- js实现多线程、jJavascript是单线程的深入分析
- Python 简单的多线程执行命令
- 单线程同步;多线程异步理解
- Linux C 多线程执行顺序问题
- python 多线程远程执行命令
- [置顶] [转]Java多线程--让主线程等待所有子线程执行完毕
- 多线程用同一个dao对象就会存在多个线程执行同一方法,为什么不用考虑线程安全问题
- Java多线程--让主线程等待所有子线程执行完毕
- java多线程 主线程等子线程执行完毕
- 多线程异步执行
- python多线程与单线程之间的差距
- JUnit4 多线程执行测试用例
- PHP单线程和多线程调用