什么是线程?
一个程序同时执行多个任务, 每个任务称为一个线程 (thread). 可以同时运行一个以上线程的程序被成为多线程程序 (multithread)
创建一个线程并执行
new Thread().start();
中断线程
当线程的 run 方法执行方法体中最后一条语句后, 并经由执行 return 语句返回时, 或者出现了在方法中没有捕获的异常时, 线程将终止.
没有可以强制线程终止的方法, 但 interrupt 方法可以用来请求终止线程.
线程状态
线程有 6 种状态
- New(新建)
- Runnable(可运行)
- Blocked(被阻塞)
- Waiting(等待)
- Timed waiting(计时等待)
- Terminated(终止)
- New(新建)
当用 new 创建一个新线程对象时, 线程处于新建状态
- Thread t = new Thread();
- Runnable(可运行)
一旦调用 start(), 线程处于 runnable 状态, 可能正在运行, 也可能没在运行, 这取决于系统给线程提供运行的时间.
抢占式调度系统会给每一个可运行线程一个时间片来执行任务, 当时间片用完, 操作系统剥夺该线程的运行权, 并给另一线程运行机会, 当选择下一个线程时, 操作系统考虑线程的优先级.
Blocked(被阻塞)
当一个线程试图获得一个内部的对象锁, 而锁被其他线程持有, 则该线程进入阻塞状态
Waiting(等待)
当线程等待另一个线程通知调度器一个条件时, 进入 waiting(等待) 状态
Timed waiting(计时等待)
有几个参数有一个超时参数, 调用它们导致线程进入计时等待状态. 这一状态将一直保持到超时期满或者接到适当通知
Terminated(终止)
线程因如下两个原因之一而终止:
因 run 方法正常退出而自然死亡
因为一个没有捕获的异常终止了 run 方法而意外死亡
线程属性
线程优先级
每个线程有一个优先级. 默认情况下, 一个线程继承自父线程的优先级, 调用 setPriority() 设置. 线程优先级高度依赖于系统, Windows 有 7 个优先级, Oracle 为 Linux 提供的 JVM 线程优先级被忽略
守护线程
t.setDaemon(true) 可以将线程转换为一个守护线程. 守护线程的唯一用途是为其他线程提供服务
当只剩下守护线程时, JVM 就退出了
线程组
线程组是一个可以统一管理的线程集合, 默认情况下, 创建的所有线程属于相同的集合, 但也可以创建其他组
处理未捕获异常处理器
线程的 run 方法不能抛出受查异常, 但非受查异常会导致线程终止. 在线程死亡前, 该异常被传递到一个用于未捕获异常的处理器.
该处理器实现了 Thread.UncaughtExceptionHandler 接口
如果不为独立的线程安装处理器, 此时的处理器就是该线程的 ThreadGroup 对象
竞争条件 (race condition), 两个或两个以上的线程需要共享对同一数据的存储.
Java 中有两种机制防止代码块受并发访问的干扰. synchronized 关键字, ReentrantLock 类.
来源: http://www.bubuko.com/infodetail-3048310.html