java 线程 阻塞 java线程阻塞和等待的区别 您所在的位置:网站首页 线程阻塞和休眠的区别 java 线程 阻塞 java线程阻塞和等待的区别

java 线程 阻塞 java线程阻塞和等待的区别

2024-06-18 02:17| 来源: 网络整理| 查看: 265

一、概述

java 线程 阻塞 java线程阻塞和等待的区别_多线程

从图中可以看出,线程的状态大致可分为5种,NEW、RUNNABLE、RUNNING、BLOCKED、TERMINATED。可能读者会感到疑惑,为什么没有等待状态,其实大家可以不必刻意去区分等待状态和阻塞状态,只需要弄清楚二者的区别即可。

等待状态的定义:处于这种状态的线程无限期地等待另一个线程执行特定操作。

阻塞状态的定义:一个线程因为等待临界区的锁被阻塞产生的状态。

我们可以看出二者的区别等待状态是主动的阻塞,阻塞状态是被动的阻塞。大家可以看看能够进入等待状态的方法:Object.wait()、Thread.join()、Thread.sleep()。这些方法都是该线程已经获取到了对象的锁。而阻塞是指当前线程去和其他线程竞争锁失败。此外还有一个TIMED_WATING,这也是等待的一种,只是添加了超时机制而已,所以大家在编程或者面试中只需要理解清楚阻塞和等待的区别即可,从本质上说,他们都属于阻塞。所以本文将这三种都归于BLOCKED状态。

二、状态介绍1、NEW状态

在Java中,我们使用new Thread()去创建一个线程,这是就对应NEW状态,但是此时仅仅只是在Java堆中创建了一个对象而已。当前线程在虚拟机中并不存在。

2、RUNNABLE状态

在线程到达了NEW状态之后,此时调用start()方法,此时JVM才真正的创建了一个线程,但是线程创建之后,并不能马上执行,它需要等待CPU资源。现在只是说它只具备执行的资格。所以在这个状态只能到RUNNING状态,因为它都没获得CPU去执行代码逻辑,就不要想通过什么方法去到阻塞状态了。

3、RUNNING状态

当CPU在任务可执行队列中选中了当前线程,那么此时该线程就能够真正的开始执行代码逻辑,此时就进入到了RUNNING状态。此时RUNNING状态能够变化的状态就比较多了。不过也很好理解:

时间片用完,变为RUNNABLE.调用yield()方法,主动放弃CPU使用权,变成RUNNABLE状态。由于阻塞IO操作,进入BLOCKED状态。竞争锁失败,进入BLOCKED状态。调用sleep或者wait方法进入BLOCKED状态。调用stop方法进入TERMINATED状态。4、BLOCKED状态

上述已经分析了进入BLOCKED状态的原因,那么BLOCKED状态能够切换到何种状态呢?

阻塞操作结束,比如IO到达,进入RUNNABLE状态。线程完成了指定时间的休眠,进入RUNNABLE状态。被其他线程notify或者notifyAll唤醒,进入RUNNABLE状态。线程获取到了锁,进入RUNNABLE状态。线程在执行过程中被打断,比如其他线程调用了interupt方法,进入RUNNABLE状态。5、TERMINATED状态

该状态是线程的最终状态,切换到该状态的线程不会在切换到其他任何状态。线程到这种状态的动作有以下几点:

线程方法体正常结束。线程运行出错,意外结束。JVM崩溃,所有线程被终止。调用一个线程的stop()方法强制终止线程。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有