第14章 并发
- 什么是线程
- 中断线程
- 线程状态
- 线程属性
- 同步
- 阻塞队列
- 线程安全的集合
- Callable与Future
- 执行器
- 同步器
- 线程与Swing
什么是线程
线程是操作系统能够进行运算调度的最小单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。在同一个进程中的所有线程共享进程的堆和方法区,但每个线程都有自己的程序计数器、虚拟机栈和本地方法栈。
中断线程
当线程的run方法执行完毕或者在方法中出现了没有捕获的异常时,线程将终止。没有可以强制线程终止的方法,然而,interrupt方法可以用来请求终止线程(当对一个线程调用 interrupt 方法时,线程的中断状态将被置位。这是每一个线程都具有的 boolean 标志。每个线程都应该不时地检査这个标志,以判断线程是否被中断)。
线程状态
线程可以有如下6种状态:
- New(新创建)
- Runnable(可运行)
- Blocked(被阻塞)
- Waiting(等待)
- Timed waiting(计时等待)
- Terminated(被终止)
要确定一个线程的当前状态,调用getState方法。
新创建线程
当用 new 操作符创建一个新线程时,如 newThread(r), 该线程还没有开始运行。这意味着它的状态是 new。当一个线程处于新创建状态时,程序还没有开始运行线程中的代码。在线程运行之前还有一些基础工作要做。
可运行线程
一旦调用 start 方法,线程处于 runnable 状态。一个可运行的线桿可能正在运行也可能没有运行, 这取决于操作系统给线程提供运行的时间。(Java 的规范说明没有将它作为一个单独状态。一个正在运行中的线程仍然处于可运行状态。)
一旦一个线程开始运行,它不必始终保持运行。事实上,运行中的线程被中断,目的是为了让其他线程获得运行机会。线程调度的细节依赖于操作系统提供的服务。抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完,操作系统剥夺该线程的运行权, 并给另一个线程运行机会(见图 14-4 )。当选择下一个线程时, 操作系统考虑线程的优先级。
被阻塞线程和等待线程
11
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment