Thread类中的常用线程方法
sleep
- 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
- 睡眠结束后的线程未必会立刻得到执行(重新参与cpu时间片分配中)
- 建议用 TimeUnit 的 sleep() 代替 Thread 的 sleep()来获得更好的可读性
- 当sleep过程中被中断时,会清除interrupt标记
wait
- wait方法会等待一个线程运行完毕 , 期间会释放锁,直到另一个线程主动notify,重新拿到锁才能继续运行
- wait方法需要与synchronized搭配使用
notify/ notifyAll
- notify唤醒持有对象锁的线程(如果持有对象锁不止一个,则是随机唤醒,会导致虚假唤醒的情况)
- notifyAll是唤醒所有持有该对象锁的线程,建议使用这个方法
yield
- 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后cpu重新调度线程
- 被yield的线程可能重新获得执行权
start 和 run的区别
- 运行start:启动新的线程,通过新的线程间接执行 run()方法
- 运行run:没有启动新的线程,是在主线程中执行了 run()方法
join
等待目前线程执行完毕,期间并不会释放锁,而是一直等待当前线程执行完毕。
interrupt
- 打断阻塞线程:可以使用 interrupt 方法打断正在睡眠的线程,那么被打断的线程这时就会抛出一个 InterruptedException异常(注意:被打断的线程会有个
打断标记
使用wait、join会清除一个标记) - 打断正在运行的线程:例如,正在循环监听的一个while语句,这时候我们可以从外部使用interrupt,但interrupt不会终止循环。(循环里面可以通过判断打断标记的值来决定是否退出循环)
- Thread.hread.interrupted() 返回打断标记,但是会清除打断状态 () 返回打断标记,但是会清除打断状态
- isInterrupted():返回打断标记的布尔值
LockSupport
特点:
- 与 Object 的 wait & notify 相比 wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必 (基于线程)
- park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】
- park & unpark 可以先 unpark,而 wait & notify 不能先 notify