您的位置:首页 > 编程语言 > Java开发

深入理解Java多线程学习笔记-线程的状态

2018-04-21 22:55 691 查看
线程状态转换图

线程状态说明
NEW: 还没有启动的线程就处于这个状态,通常对应的就是还没有调用线程的start()方法
RUNNABLE: 可运行状态,同时包括正在运行的线程都是状态,通常对应的调用线程的start()方法后
BLOCKED: 阻塞状态,当线程获取不到锁就会进入阻塞状态,对应的就是进入synchronized块或方法不成功
WAITING: 等待状态,当调用Object.wait,Thread.join,LockSupport.part等方法线程会进入等待状态线程调用等待状态,通常需要另一个线程调用Object.notify,Object.notifyAll或LockSupport.unpart方法才能回到RUNNABLE状态
TIMED_WAITING: 超时等待状态,当调用Thread.sleep,Object.wait(long),Thread.join(long),
LockSupport.parkNanos,LockSupport.parkUntil等方法会进入超时等待状态
TERMINATED: 结束状态,当线程执行完成任务后进入结束状态或抛出异常后
验证线程状态中NEW和RUNNABLE的代码
public class ThreadState {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getState());
}
});

System.out.println(thread.getState());
thread.start();
}
}

运行上面的代码,控制台会输出线程的两种状态

验证线程的状态BLOCKED,WAITING,TIME_WAITING,TERMINATED的代码

备注:下面的代码来自《Java并发编程的艺术》

public class ThreadState {
public static void main(String[] args) {
new Thread(new TimeWaiting(), "TimeWaitingThead").start();
new Thread(new Waiting(), "WaitingThread").start();

new Thread(new Blocked(), "BlockedThread-1").start();
new Thread(new Blocked(), "BlockedThread-2").start();
}

static class TimeWaiting implements Runnable {

@Override
public void run() {
while (true) {
SleepUtils.second(100);
}
}
}

static class Waiting implements Runnable {

@Override
public void run() {
while (true) {
synchronized (Waiting.class) {
try {
Waiting.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

static class Blocked implements Runnable {

@Override
public void run() {
synchronized (Blocked.class) {
while (true) {
SleepUtils.second(100);
}
}
}
}

}
运行上面的代码,使用jstack工具即可查看线程的状态,如下图:














阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: