《Java Thread Programming》,Learn how to use threads for faster, more efficient Java programming.
这是一本 1999年的书,JDK1、JDK2时代的书籍,但是直到现在(2015年),已经到了JDK8时代,这本书依然很有参考价值,作者对于线程的理解非常深刻,对于 Java Threads的介绍透彻、详细,非常适合有一定Java Threads基础的同学阅读,加深理解,提高境界。
Paul Hyde,是一个资深工程师,Java 2 Platform 的Sun认证工程师,从1996年,“Started working with Java”,然后仅仅3年之后的1999年,就有了这本书,极具技术功底,和言传身教的培训能力。
下面的章节内容评述,针对对Java Thread编程有一定基础的同学,如果您是Java的初学者,可能有不同的理解。
Part 1 Threads
本书的第一部分,介绍的是JDK中Java Threads相关的技术,直到现在,这些技术依然存在,历经15年,虽然JDK多了很多特性,很多线程相关的新技术、新工具,但是,这些JDK 1时代的技术依然存在、有用,并广泛使用。
第一部分,最重要的章节是:5、6、7、8。
Chapter 1 - Introduction to Threads
介绍多线程编程在Java中的使用,为什么要用多线程,比如:更好的用户交互、并发任务的模拟、多处理器性能的利用、简化对象模型等等。
“Easy to Start, Tough to Master”,领会逐渐加深,理论...实践...
Chapter 2 - A Simple Tow-Thread Example
本章,演示了一个非常简单的两个线程的历程。两个线程同时工作,各自在控制台输出他们自己的信息。快速看看例子,并跳过此章即可。
Chapter 3 - Creating and Starting a Thread
本章,介绍了 Thread API 的使用,比如获取当前正在运行的线程句柄,开始线程,看线程是否存活,线程睡眠等等。
这些API,我们都用过了,我们也有一些经验,比如,知道给Thread起个名字,对于排查问题的好处,所以,本章快速阅读一遍即可,一来加深下认知,二来练练英文阅读能力也好。
Chapter 4 - Implementing Runnable Versus Extending Threads
两种方式:Thread/Runnable 生成线程的比较,这个也是很熟了,并且本章的例程用的是 Java UI 编程相关的,对于我们参考价值很低,所以本章直接略过。
Chapter 5 - Gracefully Stopping Threads
本章介绍的主要Thread 的 中断 相关的 API,通过中断停止线程,是暴力的方法;通过设置信号,才是优雅地停止线程的方法。
本章还介绍了JDK 已经 deprecated 的API,suspend(), resume(), stop(), 应该被避免使用。
Chapter 6 - Thread Prioritization
本章介绍的是 Thread 的优先级 相关的 API,比如setPriority(), yield()等。
本章最值得记住的是线程的6种状态,其实是 Thread.State 枚举的6个值,当我们使用jstack看线程栈时,这是很有用的。
本章,还介绍了线程调度器的工作,值得一看。
Chapter 7 - Concurrent Access to Objects and Variables
本章开始进入线程安全编程方式的讲解,比如 synchronized(锁对象、锁类),volatile,介绍了一些线程安全的集合类,死锁的场景和避免,如何加速并发访问(减小锁粒度)。
本章内容较多,需要花一些时间来看。
Chapter 8 - Inter-thread Communication
本章介绍的线程间协作的知识,非常非常重要。线程协作,最多的实际场景,都是互斥下的协作(在同一把锁上)。JDK内,有大量的线程间协作的场景,也有大量的线程协作的工具,可能用的不是原始的技术了,但是,思想不变。
本章是必须,花时间好好看看,并理解透彻的,作者的一些例子,也都是多线程编程的经验之谈,比如早通知、错过信号。
本章的 wait()、notify()、notifyAll()、join,ThreadLocal,都很重要;Piped流,可以先不看,应用场景少。
Chapter 9 - Threads and Swing
本章又是 Java UI,使用场景少,先不看。
Chapter 10 - Thread Groups
本章可以看看,了解一下 Java Thread 的分组,实际使用场景并不多。
Part 2 Techniques
本书的第二部分,开始基于第一部分学到的线程知识,演示一些应用场景,解决一些问题。
Chapter 11 - Self-Running Objects
介绍了生成一个自动运行的类,自动运行的类,应用场景很多的,比如GC、定时任务、连接池等等。
本章很简单,快速看看即可。
Chapter 12 - Exception Callback
线程发生异常,如果没有catch,就会停掉,那么还有其他处理异常的办法吗?
本章介绍了通过 Exception Callback 的方式,了解即可。
Chapter 13 - Thread Pooling
本章的两个例子,介绍了线程池的实现,我们可以看到,JDK 5 中的 ThreadPoolExecutor,和这个思路十分相似,只是 ThreadPoolExecutor 更强大。
这两个例子,让我们理解了线程池是如何工作的:在池子里干活,在池子里等等,在池子里销毁;让我们理解,Thread 实例化后,只是一个对象,只有 start 之后,才是一个工作线程。
第二个例子,除了以上知识,演示了一个简单 Web Server 的实现。
本章是必看,必须深入领会的内容。
Chapter 14 - Waiting for the Full Timeout
本章内容较简单,是第一部分的知识:早通知、基于信号的优雅结束 的演示。
Chapter 15 - Breaking Out of a Blocked I/O State
阻塞I/O,不接受 interrupt,如何 打断它呢?关闭流。
Chapter 16 - The SureStop Utility
本章介绍了一个监视工具,如何监视一个队列中线程的运行,并在到期后关闭。wait-notify 技术的演示。
Chapter 17 - The BooleanLock Utility
本章封装了一个BooleanLock工具,也是wait-notify 技术的演示。
Chapter 18 - FIFO Queue
本章演示了一个线程安全的、有界的(基于环形数组)的先进先出队列,我们可以看到,JDK 5 才开始的BlockingQueue,和这个原理十分相似。