版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ytlviv1985/article/details/79278008
线程可以处于下列状态之一:
NEW
至今尚未启动的线程处于这种状态。RUNNABLE
正在 Java 虚拟机中执行的线程处于这种状态。BLOCKED
受阻塞并等待某个监视器锁的线程处于这种状态。WAITING
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。TIMED_WAITING
等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。TERMINATED
已退出的线程处于这种状态。
在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。
通过代码来验证这几种状态
public class ThreadStateTest {
public static void main(String[] args) throws InterruptedException {
WorkJob wj=new WorkJob();
Thread t=new Thread(wj);
System.out.println(String.format("线程没启动的状态:%s",t.getState().name()));
t.start();
Thread.sleep(500);
System.out.println(String.format("线程启动后的状态:%s",t.getState().name()));
t.interrupt();
t.join();
System.out.println(String.format("线程执行完毕的状态:%s",t.getState().name()));
}
public static class WorkJob implements Runnable{
public void run() {
Thread curr=Thread.currentThread();
System.out.println(String.format("线程正在执行的状态:%s",curr.getState().name()));
try {
curr.sleep(1000);
} catch (InterruptedException e) {
System.out.println(String.format("线程中断后的状态:%s",curr.getState().name()));
}
}
}
}
执行结果:
线程没启动的状态:NEW
线程正在执行的状态:RUNNABLE
线程启动后的状态:TIMED_WAITING
线程中断后的状态:RUNNABLE
线程执行完毕的状态:TERMINATED
BLOCKED
受阻塞并等待某个监视器锁的线程处于这种状态。
public class ThreadStateTest1 {
public static void main(String[] args) throws InterruptedException {
WorkJob wj=new WorkJob();
Thread t1=new Thread(wj,"w1");
t1.start();
System.out.println(String.format("线程%s启动后的状态:%s",t1.getName(),t1.getState().name()));
Thread t2=new Thread(wj,"w2");
t2.start();
Thread.sleep(500);
System.out.println(String.format("线程%s启动后的状态:%s",t2.getName(),t2.getState().name()));
}
public static class WorkJob implements Runnable{
public void run() {
Thread curr=Thread.currentThread();
System.out.println(String.format("线程%s--synch代码块的状态:%s",curr.getName(),curr.getState().name()));
synchronized (ThreadStateTest1.class) {
try {
curr.sleep(3000);
} catch (InterruptedException e) {
}
}
}
}
}
执行结果:
线程w1--synch代码块的状态:RUNNABLE
线程w1启动后的状态:RUNNABLE
线程w2--synch代码块的状态:RUNNABLE
线程w2启动后的状态:BLOCKED
WAITING
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
扫描二维码关注公众号,回复:
3683454 查看本文章
public class ThreadStateTest1 {
static Object obj=new Object();
public static void main(String[] args) throws InterruptedException {
WorkJob wj=new WorkJob();
Thread t1=new Thread(wj,"w1");
t1.start();
System.out.println(String.format("线程%s启动后的状态:%s",t1.getName(),t1.getState().name()));
Thread t2=new Thread(wj,"w2");
t2.start();
Thread.sleep(500);
System.out.println(String.format("线程%s启动后的状态:%s",t2.getName(),t2.getState().name()));
}
public static class WorkJob implements Runnable{
public void run() {
Thread curr=Thread.currentThread();
System.out.println(String.format("线程%s--synch代码块的状态:%s",curr.getName(),curr.getState().name()));
synchronized (obj) {
try {
obj.wait(); // WAITING
// obj.wait(1000); // TIMED_WAITING
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
执行结果:
线程w1启动后的状态:RUNNABLE
线程w1--synch代码块的状态:RUNNABLE
线程w2--synch代码块的状态:RUNNABLE
线程w2启动后的状态:WAITING
整体运行状态图