线程的状态
来源:互联网 发布:怎么安装mac os x 编辑:程序博客网 时间:2024/06/06 04:07
在线程Thread类中,有一个枚举类State,列举了线程的六大状态
public enum State { /** * Thread state for a thread which has not yet started. * 刚刚新建好的线程所处的状态 */ NEW, /** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may * be waiting for other resources from the operating system * such as processor. * 这个状态代表线程可能处于就绪状态,当获得cpu资源时进行执行,也可能是正则执行的线程 */ RUNNABLE, /** * Thread state for a thread blocked waiting for a monitor lock. * A thread in the blocked state is waiting for a monitor lock * to enter a synchronized block/method or * reenter a synchronized block/method after calling * {@link Object#wait() Object.wait}. * 这个状态代表在调用Object.wait()释放了对象锁,并且该线程已经被唤醒,调用了Object.notify()方法之后 */ BLOCKED, /** * Thread state for a waiting thread. * A thread is in the waiting state due to calling one of the * following methods: * <ul> * <li>{@link Object#wait() Object.wait} with no timeout</li> * <li>{@link #join() Thread.join} with no timeout</li> * <li>{@link LockSupport#park() LockSupport.park}</li> * </ul> * * <p>A thread in the waiting state is waiting for another thread to * perform a particular action. * * 一般在调用了Object.wait()或者Thread.join方法后,当前线程会立即进入的状态,结束等待之后线程会进入runnable或者blocked状态 */ WAITING, /** * Thread state for a waiting thread with a specified waiting time. * A thread is in the timed waiting state due to calling one of * the following methods with a specified positive waiting time: * <ul> * <li>{@link #sleep Thread.sleep}</li> * <li>{@link Object#wait(long) Object.wait} with timeout</li> * <li>{@link #join(long) Thread.join} with timeout</li> * <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li> * <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li> * </ul> * 在调用了上述方法之后,线程进入该状态,这是一个带有时间限制的等待状态,在超过了这个时间之后,线程会结束等待状态 */ TIMED_WAITING, /** * Thread state for a terminated thread. * The thread has completed execution. * 线程终止 */ TERMINATED;}区分BLOCKED和WAITING
package thread;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * * Thread的waiting状态和blocked状态 * 在调用Object.wait()后是waiting状态 * 在调用Object.notify()后开始竞争锁之后变成Bloceked状态 * * @author 17020044 * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */public class WaitNotify { private static Object monitor; static{ monitor = new Object(); } public static void main(String[] args) { ExecutorService pool = Executors.newCachedThreadPool(); Thread threadA = new Thread(){ @Override public void run(){ synchronized(monitor){ try { System.out.println("before calling wait()"); monitor.wait(); System.out.println("after calling wait()"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; Thread threadB = new Thread(){ @Override public void run(){ synchronized (monitor) { try { System.out.println("before calling notify"); monitor.notify(); Thread.sleep(30000); System.out.println("after calling notify"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; pool.submit(threadA); /* * jconsole线程 * java.lang.Object@2a14d8c8上的WAITING * java.lang.Object@2a14d8c8上的BLOCKED, 拥有者: pool-1-thread-2 */ try { Thread.sleep(30000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } pool.submit(threadB); }}
运行上面的程序,然后打开jconsole查看两个线程的状态变化,可以看出来,blocked状态是线程在被唤醒之后进行锁(除了锁,还有IO资源)的竞争时的状态。
线程池也有对应的状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED
RUNNING:接收新的任务,并且处理任务队列
SHUTDOWN:不接收新的任务, 但是还在处理任务队列
STOP:不接收新的任务, 不处理任务队列,并且中断正在执行的任务
TIDYING:所有任务终止,workerCount为0,之后会调用terminated()方法
TERMINATED: terminated()方法调用完成
RUNNING -> SHUTDOWN 调用shutdown()方法
(RUNNING or SHUTDOWN) -> STOP 调用shutdownNow()方法
SHUTDOWN -> TIDYING 当线程池和阻塞队列都为空的时候
STOP -> TIDYING 当线程池为空的时候
TIDYING -> TERMINATED terminated()方法调用完成
阅读全文
0 0
- 线程的状态
- 线程的状态
- 线程的状态
- 线程状态的转换
- 线程状态的转换
- 线程的状态转换
- 线程的状态转换
- 线程状态的转换
- 浅谈线程的状态
- 线程的状态转换
- 线程的分离状态
- 获得线程的状态
- 线程的各个状态
- 线程的状态转换
- 线程的分离状态
- 线程的分离状态
- 线程状态的转换
- 线程的分离状态
- reactNative环境
- 并发(二):java线程池技术
- C++ 中关于虚函数的介绍
- 第一篇博客
- 使用Python横向合并excel文件
- 线程的状态
- Python入门——while
- VS2013安装部署项目为安装包超详细
- 03-元素定位-基本
- 用于多(情况多)路选择的:switch语句(无break跳出)
- 如何在PostgreSQL中实现增量备份
- telephonyManager的使用
- 字符串搜索函数应用
- C语言与指针学习笔记