java多线程学习之一——线程的状态、上下文切换和线程监控
多线程
线程的状态
1. NEW(图中初始状态):一个刚创建而未启动的线程处于该状态。由于一个线程实例只能被启动一次,因此一个线程只可能有一次处于该状态。
2. 可运行(RUNNABLE):表示处于改状态的线程可以被JVM的线程调度器(scheduler)进行调度而使之处于运行中(RUNNING)状态。
阻塞状态(BLOCKED):一个线程发起一个阻塞式I/O操作后,或者试图去获得一个由其他线程持有的锁时,相应的线程会处于该状态。处于改状态的线程不会占用CPU资源。
3. 等待队列:分为两个,WAITING和TIMED_WAITING
1) WAITING一个线程执行了某些方法调用之后就会处于这种无限等待其他线程执行特定操作的状态。这个方法包括:Object.wait()、Thread.join()和LockSupport.park()。
对应使线程转换为可运行状态的方法是:Object.notify()、Object.notifyAll()和LockSupport.unpark(thread)。
2)TIMED_WAITING 与WAITING类似,差别是该状态的线程并非无限等待其他线程执行特定操作,而是处于带有时间限制的等待状态。当时间到了,自动转化为可运行状态。
4. 结束(TERMINATED):已经执行结束的线程处于该状态。
上下文切换
一个线程在其整个生命周期中,只可能一次处于NEW状态和TERMINATED状态。而一个线程的状态从RUNNABLE状态转换为WAITING、TIMED_WAITING、BLOCKED这几个状态的任意一个都是上下文切换。
线程的监视
一个真实的java系统运行时往往有上百个线程在运行,如果没有工具进行监控,那么这些线程对于我们来说就变成了黑盒。而我们在开发过程中进行代码调试,需要将线程变为白盒。
1) 开发和测试环境下
JDK自带工具jvisualvm(JDK_HOME\bin\jvisualvm.exe) 可以实现线程的监控,它适合于在开发和测试环境下监控java系统中的线程情况
启动界面如图:
2) 线上环境
JDK自带的另外一个工具jstack。jstack是一个命令行工具,通过它可以获取指定java进程的线程信息。
使用方法:先找到要分析的进程pid,然后使用命令:jstack pid
3) java 8
Java Mission Control(JMC) 这个工具来监视java线程
参考:
《java多线程编程实战指南》黄文海