多线程的几种状态
Posted 哔卟哔卟_: )
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的几种状态相关的知识,希望对你有一定的参考价值。
Java-多线程的几种状态
- 🔎1.NEW( 系统中线程还未创建,只是有个Thread对象)
- 🔎2.RUNNABLE( (就绪状态. 又可以分成正在工作中和即将开始工作)
- 🔎3.TERMINATED(系统中的线程已经执行完了,Thread对象还在)
- 🔎4.TIMED_WAITING(指定时间等待,调用Thread.sleep()方法)
- 🔎5.BLOCKED(线程阻塞状态)
- 🔎6.WAITING(使用wait方法出现的状态)
- 🔎结尾
多线程的状态
- NEW( 系统中线程还未创建,只是有个Thread对象)
- RUNNABLE(就绪状态. 又可以分成正在工作中和即将开始工作)
- TERMINATED(系统中的线程已经执行完了,Thread对象还在)
- TIMED_WAITING(指定时间等待,调用Thread.sleep()方法)
- BLOCKED(线程阻塞状态)
- WAITING(使用wait方法出现的状态)
🔎1.NEW( 系统中线程还未创建,只是有个Thread对象)
public class Test
public static void main(String[] args)
Thread t = new Thread(() ->
);
//线程启动之前获取线程状态 --> 只是有个Thread对象
System.out.println(t.getState());
t.start();
🔎2.RUNNABLE( (就绪状态. 又可以分成正在工作中和即将开始工作)
public class Test
public static void main(String[] args)
Thread t = new Thread(() ->
while(true)
try
Thread.sleep(500);
catch (InterruptedException e)
e.printStackTrace();
);
t.start();
//线程就绪状态
System.out.println(t.getState());
🔎3.TERMINATED(系统中的线程已经执行完了,Thread对象还在)
public class Test
public static void main(String[] args)
Thread t = new Thread(() ->
);
t.start();
try
Thread.sleep(500);
catch (InterruptedException e)
e.printStackTrace();
//线程TERMINATED状态
System.out.println(t.getState());
🔎4.TIMED_WAITING(指定时间等待,调用Thread.sleep()方法)
public class Test
public static void main(String[] args)
Thread t = new Thread(() ->
while(true)
try
Thread.sleep(500);
catch (InterruptedException e)
e.printStackTrace();
);
t.start();
try
Thread.sleep(3000);
catch (InterruptedException e)
e.printStackTrace();
//线程TIMED_WAITING状态
System.out.println(t.getState());
🔎5.BLOCKED(线程阻塞状态)
阻塞状态值得是代码不继续执行,而在等待
阻塞结束后,线程重新进入就绪状态
影响阻塞的方法
- sleep()
- wait()
- join()
- yield()
🔎6.WAITING(使用wait方法出现的状态)
线程调用 wait() 方法之后,就会变为 WAITING状态
🔎结尾
如果大家有什么不太理解的,可以私信或者评论区留言,一起加油
java多线程的几种状态
java线程状态在Thread中定义,源码中能看到有个枚举State,总共定义了六种状态:
NEW: 新建状态,线程对象已经创建,但尚未启动
RUNNABLE:就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,等待获取操作系统资源如CPU,操作系统调度运行。
BLOCKED:堵塞状态。线程等待锁的状态,等待获取锁进入同步块/方法或调用wait后重新进入需要竞争锁
WAITING:等待状态。等待另一个线程以执行特定的操作。调用以下方法进入等待状态。 Object.wait(), Thread.join(),LockSupport.park
TIMED_WAITING: 线程等待一段时间。调用带参数的Thread.sleep, objct.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil
TERMINATED:进程结束状态。
状态之间的转换状态图,总结了下,如下:
其中,Thread.sleep(long)使线程暂停一段时间,进入TIMED_WAITING时间,并不会释放锁,在设定时间到或被interrupt后抛出InterruptedException后进入RUNNABLE状态; Thread.join是等待调用join方法的线程执行一段时间(join(long))或结束后再往后执行,被interrupt后也会抛出异常,join内部也是wait方式实现的。
wait方法是object的方法,线程释放锁,进入WAITING或TIMED_WAITING状态。等待时间到了或被notify/notifyall唤醒后,回去竞争锁,如果获得锁,进入RUNNABLE,否则进步BLOCKED状态等待获取锁。
下面是一个小例子,主线程中调用多线程,等待超时后如果子线程还未结束,则中断子线程(interrupt)。
以上是关于多线程的几种状态的主要内容,如果未能解决你的问题,请参考以下文章