第16章 多线程

第16章 多线程

本章要点

  • 线程的基础知识
  • 理解线程和进程的区别与联系
  • 三种创建线程的方式
  • 线程的run()方法和start方法的区别与联系
  • 线程的生命周期
  • 线程死亡的几种情况
  • 控制线程的常用方法
  • 线程同步的概念和必要性
  • 使用synchronized控制线程同步
  • 使用Lock对象控制线程同步
  • 使用Object提供的方法实现线程通信
  • 使用条件变量实现线程通信
  • 使用阻塞队列实现线程通信
  • 线程组的功能和用法
  • 线程池的功能和用法
  • Java8增强的ForkJoinPool
  • ThreadLocal类的功能和用法
  • 使用线程安全的集合类
  • Java9新增的发布-订阅框架

前面大部分程序,都只是在做单线程的编程,前面所有程序(除第11章、第12章的程序之外,它们有内建的多线程支持)都只有一条顺序执行流——程序从main()方法开始执行,依次向下执行每行代码,如果程序执行某行代码时遇到了阻塞,则程序将会停滞在该处。如果使用IDE工具的单步调试功能,就可以非常清楚地看出这一点

但实际的情况是,单线程的程序往往功能非常有限,例如开发一个简单的服务器程序,这个服务器程序需要向不同的客户端提供服务时,不同的客户端之间应该互不干扰,否则会让客户端感觉非常沮丧。

多线程听上去是非常专业的概念,其实非常简单:

  • 单线程的程序(前面介绍的绝大部分程序)只有一个顺序执行流,
  • 多线程的程序则可以包括多个顺序执行流,多个顺序流之间互不干扰。

可以这样理解:

  • 单线程的程序如同只雇佣一个服务员的餐厅,他必须做完一件事情后才可以做下一件事情;
  • 多线程的程序则如同雇佣多个服务员的餐厅,他们可以同时做多件事情

Java语言提供了非常优秀的多线程支持,程序可以通过非常简单的方式来启动多线程。
本章将会详细介绍Java多线程编程的相关方面,包括创建、启动线程、控制线程,以及多线程的同步操作,并会介绍如何利用Java内建支持的线程池来提高多线程性能。