(十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别

多线程状态,彼此之间有什么关系?

(十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别_第1张图片

线程状态

1.新建

new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。

2.等待

当线程在new之后,并且在调用start方法前,线程处于等待状态

3.就绪

当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。

4.运行状态

处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。

只有处于就绪状态的线程才有机会转到运行状态。

5.阻塞状态

阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。

阻塞状态分为三种:

1、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

2、同步阻塞:运行的线程在获取对象同步锁时,若该同步锁被别的线程占用,则JVM会把线程放入锁池中。

3、其他阻塞:运行的线程执行Sleep()方法,或者发出I/O请求时,JVM会把线程设为阻塞状态。当Sleep()状态超时、或者I/O处理完毕时,线程重新转入就绪状态。

6.死亡状态

当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。

sleep 和 wait 区别

共同点:都是把当前线程阻塞住,等待或休眠

不同点:

Wait( ) : 当线程执行到wait()方法上,当前线程会释放监视锁,此时其他线程可以占有该锁,一旦wait()方法执行完成,当前线程继续持有该锁,直到执行完锁的作用域;如下图:

(十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别_第2张图片

Sleep( ) : sleep() 和锁操作无关,如果该方法恰好在一个锁的保护范围内,当前线程即使执行sleep的时候,仍然保持监视锁。。如下图:

(十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别_第3张图片

当一个线程占有一个锁的时候,线程堆栈会打印一个-locked<0x22bffb60>

当一个线程正在在其他线程释放该锁,线程堆栈会打印一个-waiting to lock<0x22bffb60>

当一个线程占有一个锁,但又执行在该锁的wait上,线程堆栈中首先打印locked,然后打印-waiting on <0x22c03c60>

线程的状态

RUNNABLE线程正在运行状态。(Runnable状态的线程不一定消耗CPU)

(十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别_第4张图片

TIMED_WAITING(on object monitor)表示当前线程被挂起一段时间,说明该线程正在执行obj.wait(ing time)方法,该线程不消耗cpu。


(十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别_第5张图片

TIMED_WAITING(sleeping) 表示当前线程被挂起一段时间,正在执行Thread.sleep(int time )方法,如:

(十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别_第6张图片

WAITING(on object monitor)当前线程被挂起,正在执行无参数的obj.wait()方法,只能通过notify唤醒,因此不消耗cpu

(十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别_第7张图片

版本二:

1.这两个的方法来自不同的类分别是 sleep来自与 ThreadWrite来自Object

2.sleepThread的静态方法调用:a线程调用了b线程的sleep方法实际上还是a线程睡觉,要让b线程睡觉只用在b的代码中调用sleep

3.最主要是sleep方法没有释放锁 而 wait方法释放了锁

4.wait notify notifyAll  她们都是定义在Object中的

使用在同步中因为要对持有锁的线程操作

5.从执行权和锁上来分析:

wait:可以指定时间也可以不指定时间。不指定时间,只能由对应的notify或者notifyAll来唤醒。

sleep:必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。

wait:线程会释放执行权,而且线程会释放锁

Sleep:线程会释放执行权,但不是不释放锁。

你可能感兴趣的:((十二)多线程都有哪些状态,彼此之间有什么关系,wait和sleep的区别)