目录
2.4 BLOCKED,WAITING,TIMED_WAITING的转换
一.引言
本篇文章将继续介绍多线程,这次为大家介绍多线程的状态。什么是状态?简单而言就是当前所处的情况,如“还没开始执行”“执行中”“阻塞等待”等。这些就是状态!
二.线程的状态
2.1 观察线程的所有状态
线程的状态是一个枚举类型Thread.State
public class ThreadState {
public static void main(String[] args) {
for (Thread.State state : Thread.State.values()) {
System.out.println(state);
}
}
}
关于状态的查看State()可以观看我的上一篇博客:JavaEE初阶--多线程Thread基本用法-CSDN博客
2.2 线程几种状态的介绍
1.NEW:安排了工作,还没开始行动。
2.RUNNABLE:可工作的,又可以分成正在工作中和即将开始工作。
3.BLOCKED:表示排队等着其他事情。
4.WAITING:表示排队等着其他事情。
5.TIMED_WAITING:表示排队等着其他事情。
3个都是表示等着其他事情,之后我们会为大家介绍其中的区别。
在Java中,BLOCKED、WAITING和TIMED_WAITING都是线程状态。它们之间的区别如下:
-
BLOCKED状态表示线程正在等待一个监视器锁(synchronized关键字)以进入一个同步块。例如,线程A已经获得了一个对象锁,但线程B尝试访问同一个同步块,那么线程B就会进入BLOCKED状态,直到线程A退出同步块为止。
-
WAITING状态表示线程正在等待另一个线程执行特定操作。例如,调用了Object.wait()方法或Thread.join()方法时,线程就会进入WAITING状态。在WAITING状态下的线程需要其他线程执行特定的操作来唤醒它。
-
TIMED_WAITING状态与WAITING状态类似,但它有一个超时时间。例如,调用了Thread.sleep()方法或Object.wait(long timeout)方法时,线程就会进入TIMED_WAITING状态。在超时时间到达之前,该线程会一直保持这种状态。
结论 :BLOCKED表示等待获取锁,WAITING和TIMED_WAITING表示等待其他线程发来通知。
TIMED_WAITING表示在等待唤醒,但设置了时限,WAITING线程在无线等待唤醒。
2.3 线程状态之间的转换
public class Demo4 {
public static void main(String[] args) {
Thread t1=new Thread(()->{
for (int i = 0; i < 3; i++) {
}
},"李四");
System.out.println(t1.getName()+":"+t1.getState());
t1.start();
while(t1.isAlive()){
System.out.println(t1.getName()+":"+t1.getState());
}
System.out.println(t1.getName()+":"+t1.getState());
}
}
2.4 BLOCKED,WAITING,TIMED_WAITING的转换
public class Demo5 {
public static void main(String[] args) {
final Object object=new Object();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
synchronized (object){
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
},"t1");
t1.start();
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
synchronized (object){
System.out.println("haha");
}
}
},"t2");
t2.start();
}
}
状态结果可以在jconsole中找到:
三.总结
本篇文章简单地为大家介绍了一下线程的状态以及状态的相互转换,欢迎各位在评论区留下你的看法。感谢观看!