java多线程学习之一——线程的状态、上下文切换和线程监控
2017-05-15 12:17
302 查看
多线程
线程的状态
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.[b]notifyAll()[/b]和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多线程编程实战指南》黄文海
相关文章推荐
- Java多线程与并发学习之(三):线程的各种状态
- java多线程学习3-线程状态转换
- java学习多线程之线程状态
- 黑马程序员--Java学习笔记之多线程(自定义线程的两种方式对比、线程状态、线程安全)
- java多线程学习总结之二:线程状态的转换
- java多线程学习总结之四:线程的同步
- Java多线程学习 (一) 前台、后台线程
- 【java多线程与并发库】---传统java多线程<4> .线程状态及优先级
- Java基础学习__多线程(线程间通信--生产者消费者JDK5.0升级版)
- Java多线程编程--(10)学习Java5.0 并发编程包--线程工具类
- Java多线程学习:线程的生命周期
- Java基础学习6_多线程(线程间通信--生产者消费者)
- java多线程学习2-线程栈模型与线程的变量
- java基础学习__多线程(停止线程,守护线程,join方法)
- java多线程学习四:后台线程
- Java实现监控多个线程状态的实现
- java多线程学习1-继承Thread类和实现Runnable接口来创建线程
- Java多线程:线程状态
- 我的安卓学习之路--Java多线程--线程简介