您的位置:首页 > 编程语言 > Java开发

学习Java多线程(2)

2018-03-12 21:53 197 查看

认识线程的状态

为了复习Java多线程的知识,经过查看资料后通过自己的理解与认识,先画出了一张线程几种状态之间的转换过程图,然后再对几种状态进行具体描述。



1、初始状态

初始状态也就是new状态,也就是当我们写到new Thread()的时候,创建了一个新线程,但是该线程还没运行,还没有线程任务可做。

2、可运行状态

可运行状态不是执行了run方法就是可运行状态,而是调用start方法。表明这个线程是可以有资格运行的,主要分三种情况:

这时候的线程就等到时间片轮转到自己,这样就可以抢占到CPU,进行Running状态。

当到Running状态之后并没有运行run方法执行任务,而可能是由于时间片(yied方法:做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会)用完回到Runanble状态。

当处于锁定状态的线程结束当前的锁定Blocked状态之后,重新回到Runnable状态。

3、阻塞状态

阻塞状态主要分为三种,由状态图中就可以知道。

等待阻塞:当线程运行时候,执行了某个对象的wait方法,就会将此线程放入到wait等待池中。

锁定阻塞:当线程运行时,想要获得某个对象的synchronized同步锁,但是这时候锁已经被其他线程占用,那么该未获得对象锁的线程就会被放入锁池,从而导致阻塞。

其他阻塞:当线程执行了sleep方法、调用了其他线程的join方法(join方法:就是让其他线程先执行,那么该线程就会被阻塞,其他线程执行完后该线程才执行,其底层方法是wait)、或者用户I/O请求就会进入阻塞状态(这种情况很好理解,我们在main方法中I/O,就会让Console控制台输入之后才main主线程执行)。

注:从等待阻塞到锁定阻塞,是其他线程调用了notify()或者notifyAll()方法

线程A在调用了对象的wait方法进入等待状态,B线程调用了该对象的notifyAl()方法唤醒了全部的线程,从而A线程在就锁定队列中等待获得锁对象。

B线程调用了该对象的notify()方法唤醒了一个线程,但是具体是哪个线程弄不清楚。

4、正在运行状态

正在运行状态就是线程很顺利的获得了时间片,执行run方法中的线程任务,但是正在运行状态的线程可能会被打断从而变为Blocked状态或者回退到Runnable状态。

5、死亡状态

即终止Terminated状态,其发生的原因一般有两个

正常执行完run方法后线程结束进入死亡状态

可能会因为一个没有Catch到的Exception而让线程run方法意外终止,这时候线程就进入了终止死亡状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息