java并发编程实践-1.2-线程的优点

缘起

《Java并发编程实践》1.2

分析

线程的好处如下

  1. 线程从编程模型的角度上讲,例如上一小节讲到的”起床–>烧水–>看报纸”的例子,线程的一大好处在于将会发生异步的进程拆解成顺序执行的线程,每根线程只是顺序执行(因此高效)而且尽量做到职能单一, 只在必要时间点上进行同步. 这种执行过程才是高效的. 举个简单的例子讲——你是不是编写Servlet的时候觉得它就是一个单线程程序?(的确是单线程,因为它就是一根线程而已,至于什么时候登场,那是tomcat等servlet容器来调度的)

  2. 从硬件的角度上讲, 因为现在的处理器是多核的处理器. 之所以需要多核处理器是因为就处理器本身而言很难进一步提升单个处理器的时钟频率了. 所以一块芯片上要放置多个处理器. 如果单线程的进程的话,则一次进程只能运行在一个处理器上,相当于浪费了其他处理器的资源. 而拥有多个处于活跃状态的线程的进程可以在多个处理器上进行调度(线程是当今处理器时序调度的最小单源,这个在【2】中说了),这样就提高了硬件资源的利用率.

  3. 从异步事件处理角度上讲,如果web程序只是单线程的接受客户端程序的请求,则如果遇到耗时IO将导致别的客户端请求无法接入. 所以有两种解决办法

    3.1 多安排线程嘛~ 一根阻塞了,别的客户请求来了就安排别的线程来响应嘛~ 现在的linux os 中已经集成了NPTL线程包——设计NTPL的目的就是为了支持数十万甚至更多的线程接入. 即使得 thread-per-client是可能的.

    3.2 早期没有NPTL的时候,unix os将能支持的线程数限制在了数百个而已(最极端就是一根线程咯). 这就使得3.1的解决方案变得不可能. 这个时候,unix就开发了一些高效的机制——例如select和poll的系统调用(system call),而为了使用这些机制,java的类库java.nio对这种非阻塞io(即所谓的NIO)提供了支持,NIO有自己的优势,但是os本身对线程数量支持的增多意味着出现更少的底层困境.

  4. 从GUI响应角度来讲,因为单个EDT(参见【2】)的存在,所以使得现在GUI界面不会因为耗时计算(如大型文档的拼写检查)而失去响应.

参考

【1】java并发编程实践 1.2节 Goetz etc.

【2】多线程设计模式 结城浩 8.6节