我们创建了多个线程(新建状态)并调用start方法启动线程,这些线程有些抢到cpu执行权有些没有抢到,抢到的进入运行状态,

没抢到的进入阻塞状态,如果运行状态中的线程执行完毕(run()方法结束),或者调用stop()强制关闭线程,或者run()方法中产生异常,则会进入死亡状态.

阻塞状态:具有cpu的执行资格,等待cpu空闲时执行

休眠状态:放弃cpu的执行资格, cpu空闲,也不执行

 

线程状态概述:

线程状态 导致状态方生条件
new(新建) 线程刚被创建,但是并未启动,还没调用start方法
Runnable(可运性)

线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,

这取决于操作系统处理器。

Blocked(锁阻塞)

当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;

当该线程持有锁时,该线程将变成Runnable状态。

waiting(无限等待)

一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,

必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。

TimedWaiting(计时等待)

同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态

将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep .Object.wait。

Teminated(被终止) 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 原理图:

 

 

 

 

 

 

 

 

等待唤醒案例分析:

wait:线程不再活动,不再参与调度,进入wait set中,因此不会浪费CPU资源,也不会去竞争锁了,这时的线程状态即时WAITING。

  它还要等着别的线程执行一个特别的动作,也即是“通知(notify)”在这个对象上等待的线程从wait set中释放出来,重新进入到调度队列中

notify:则选取所通知对象的wait set中的一个线程释放;例如,参观有空位后,等待就餐最久的顾客最先入座。

notifyAll:则释放所有通知对象的wait set山东个全部线程。.

 

原理图:

 

 

posted on 2022-07-09 16:06  淤泥不染  阅读(21)  评论(0编辑  收藏  举报