一、线程
我们都知道,进程是系统运行程序的基本单位,打开电脑的任务管理器,就可以看到一个个运行中的进程。但是仔细观察可以发现每个进程之下,还有更多的线程。 线程是比进程更小、更轻量级的执行单位,每个进程都拥有自己的一块内存空间和变量资源等,然而同一个进程下的多个线程则共享数据和资源,所以不管线程的创建和销毁工作,还是在线程之间切换工作,都要比进程更加轻量级、消耗系统资源更少。
二、Java多线程编程
在没有接触多线程之前,我们编写的程序都只有一个作为程序入口的main函数,其实这正是一个线程Main,当然这是单线程下的编程。
1、创建多线程
初学Java多线程编程的时候,需要掌握两种创建多线程的方法:
- 声明一个Thread类的子类,子类中重写Thread类的run方法。
- 声明一个实现Runnable接口的类,类中实现run方法。
更推荐使用第二种方式创建多线程,Thread类本身也实现了Runnable接口。
public
2、线程状态
Java中线程可以有如下6中状态:
- NEW 新创建
- RUNNABLE 可运行
- BLOCKED 阻塞
- WAITING 等待
- TIMED WAITING 计时等待
- TERMINATED 终止
线程之间的状态转换如下图(图源于《Java并发编程艺术》):
三、Thread类详解
Thread类是java.lang包下的类,是多线程经常需要使用的类。因为笔者之前看过一些关于多线程的书和资料,包括《Java核心技术》的并发一章和其他文章等,但是始终无法理解其中原理,总是容易遗忘。索性这次结合着源码进行学习,笔者通过阅读Thread类的源码(笔者阅读的是JDK8的源码),并对常用的方法作出了自己的注释,确实学习效果要比之前只看资料来得扎实。 其中,笔者对一些初学者容易产生疑惑的地方都作出了注释,比如join方法的使用,线程中断等。
笔者建议大家可以将下面的代码复制进自己的一个单独的类文件,然后对比笔者的注释(这里可以通过Ctrl+f进行搜索,快速定位),结合自己阅读源码,去开始探索多线程领域。
/*