共计 1139 个字符,预计需要花费 3 分钟才能阅读完成。
- 线程状态
NEW
顾名思义,这个状态,只存在于线程刚创立,未 start
之前
RUNNABLE
这个状态的线程,其正在 JVM 中执行,然而这个 ” 执行 ”,不肯定是真的在运行,也有可能是在期待 CPU 资源。所以,在网上,有人把这个状态辨别为 READY 和 RUNNING 两个,一个示意的 start 了,资源一到位随时能够执行,另一个示意真正的执行中
BLOCKED
这个状态,个别是线程期待获取一个锁,来继续执行下一步的操作,比拟经典的就是 synchronized
关键字,这个关键字润饰的代码块或者办法,均须要获取到对应的锁,在未获取之前,其线程的状态就始终未 BLOCKED,如果线程长时间处于这种状态下,咱们就是当心看是否呈现死锁的问题了。
WAITING
一个线程会进入这个状态,肯定是执行了如下的一些代码,例如
- Object.wait()
- Thread.join()
- LockSupport.park()
当一个线程执行了 Object.wait()的时候,它肯定在期待另一个线程执行 Object.notify()或者 Object.notifyAll()。
或者一个线程 thread,其在主线程中被执行了 thread.join()的时候,主线程即会期待该线程执行实现。当一个线程执行了 LockSupport.park()的时候,其在期待执行 LockSupport.unpark(thread)。当该线程处于这种期待的时候,其状态即为 WAITING。须要关注的是,这边的期待是没有工夫限度的,当发现有
TIMED_WAITING
这个状态和 WAITING 状态的区别就是,这个状态的期待是有肯定时效的,即能够了解为 WAITING 状态期待的工夫是永恒的,即必须等到某个条件合乎能力持续往下走,否则线程不会被唤醒。然而 TIMED_WAITING,期待一段时间之后,会唤醒线程去从新获取锁。当执行如下代码的时候,对应的线程会进入到TIMED_WAITING 状态
- Thread.sleep(long)
- Object.wait(long)
- Thread.join(long)
- LockSupport.parkNanos()
- LockSupport.parkUntil()
TERMINATED
即为线程执行完结之后的状态
创立线程的三种形式:
- 继承自 Thread 类
- 实现 Runnable 接口
- 实现 Callable 接口
举荐应用第二种
保障高并发场景下的线程平安,能够从一下四个维度考量
- 数据单线程内可见。单线程总是平安的 ThreadLocal 就是采纳这种形式来实现线程平安的。
- 只读对象。
- 线程安全类。
- 同步与锁机制
java.util.concurrent 包下的分类
- 线程同步类
- 并发汇合类
- 线程治理类
- 锁相干类
参考资料:Java 线程的 6 种状态剖析
《码出高效 Java 开发手册》
正文完