线程的状态

NEW(新建)

RUNNABLE(可运行)

BLOCKED(阻塞)

WAITING(等待)

TIMED_WAITING(计时等待)

TERMINATED:(终止)

获取线程的状态使用getState()方法。

几种状态之间的转换如下:

 1、new 新建状态

当我们执行new来创造出一个线程实例的时候,此时线程就处于新建状态。新建状态就是程序已经安排好了工作,但是还没有开始执行任务,等待下一步操作。

2、Runnable 可运行状态

当我们创建好了线程实例,并且调用了start方法,程序就处于可运行状态,值得注意的是,在Java里面没有单独的把正在运行状态列为一个状态,而是把就绪状态和正在运行的状态统称为可运行状态Runnable。也就是说可运行状态中的线程分为两种就绪状态(ready)和正在运行状态(running)。

一般在执行多线程的任务时,一个线程不是从头执行到结束的,而是不断切换执行的,让其他线程有机会执行,线程调度的细节取决于系统的调度,一般当正在执行的线程被切换下的时候,就绪状态的线程就会以抢占式执行的方式开启另一个线程执行,也就是新换上的线程是哪一个是随机的。

我们也可以通过yield方法去结束一个线程的运行,该方法是一个静态方法。

3、Blocked(阻塞)Waiting(等待)Timed_Waiting(计时等待)

 这三个状态类似

阻塞状态:当一个线程试图获取一个对象锁,而这个锁已被占用(也就是发生锁竞争),该线程就会进入阻塞状态,直到其他的线程释放了锁,该线程就会进入可运行状态。

等待状态:当线程等待另外一个线程通知调度器出现一个条件时,该线程就会进入阻塞状态。例如,调用join方法或者wait方法。此时的线程位于阻塞队列之中

计时等待:调用sleep()计时方法,join()计时方法以及wait的一个重载版本可以传入时间作为参数,调用这些方法,线程就会进入计时等待状态,当时间到达时,线程会自动退出阻塞队列,变为就绪状态,也就是可运行状态。

区别:Blocked状态表示是在等待获取锁,waiting和timed_waiting表示等待其他线程发来唤醒通知 

timed_waiting是不会一直等下去,到达设定时间就自动退出该状态,waiting是无限期等待唤醒。

4、Terminated 终止状态

终止状态就是线程分配的任务已经全部完成,到达该状态有两种方法:

1、线程运行完毕run方法自然退出。

2、因为一个没有捕获的异常,使得线程意外终止。

线程的状态_第1张图片

 

你可能感兴趣的:(jvm,java-ee,java)