-
(1) 大多数并发应用程序都是围绕__任务执行__来构造的
(2) 任务通常是一些__抽象且离散__的工作单元
(3) 各个任务之间应该相互独立, 有着清晰的任务边界
(4) 大多数服务器应用提供了自然的边界选择: 以独立的客户请求为边界
-
串行的执行任务
(1) 简单的服务器应用程序示例
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) { // request-handling logic here } }(2) 在Web请求中包含了一组不同的运算与IO操作
1° 套接字IO – 网络拥塞或连通性问题而阻塞
2° 文件IO – 阻塞
3° 数据库请求 – 阻塞
(3) 结论: 这种方式不好, 无法提供高吞吐率或快速响应性
-
显式的为任务创建进程
(1) 示例
public class ThreadPerTaskWebServer { 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); } }; new Thread(task).start(); } } private static void handleRequest(Socket connection) { // request-handling logic here } }(2) 优点
1° 任务处理过程从主线程中分离出来
2° 任务可以并行处理
(3) 缺点
1° 线程生命周期的开销非常高: 线程的创建、销毁都是有代价的
2° 活跃的线程会消耗资源(内存), 给GC带来压力
3° 无限制创建线程创建多了可能会有OutOfMemoryError, 因为每个线程都有自己的虚拟机栈和本地方法栈, 这些要在内存中占据空间, 不能创建无线多个线程
(4) 任务处理代码必须是线程安全的, 因为多个任务会并发调用这段代码
-
最终__结论__: 使用__线程池__代替串行执行任务方式 或 显式创建无限制多线程方式
chapter06_任务执行_1_在线程中执行任务
最新推荐文章于 2021-11-10 21:06:17 发布
本文探讨了并发应用程序的设计,从串行执行任务的局限性到显式创建线程的问题,最终提出使用线程池作为高效并发任务处理方案。文章分析了不同并发模型的优缺点,强调了线程池在提升系统吞吐率和响应速度方面的关键作用。
989

被折叠的 条评论
为什么被折叠?



