JavaBean】线程的生命周期中都有哪些状态?

2020-12-15 16:44发布

9条回答
小猪仔
2楼 · 2020-12-16 10:34

Java的线程生命周期有六种状态:

  • New(初始化状态)

  • Runnable(就绪状态)

  • Running(运行状态)

  • Blocked(阻塞状态)

  • Terminated(终止状态)


啦啦啦
3楼 · 2020-12-16 11:29

Java的线程生命周期有六种状态:

New(初始化状态)

Runnable(就绪状态)

Running(运行状态)

Blocked(阻塞状态)

Terminated(终止状态)


james
4楼 · 2020-12-16 13:50

此图为六种状态及转换线程状态.jpg

请叫我雷锋叔叔啊
5楼 · 2020-12-16 10:32

新建 就绪 运行 阻塞 死亡

用户555666
6楼 · 2020-12-16 11:08

Java的线程生命周期有六种状态:

New(初始化状态)

Runnable(就绪状态)

Running(运行状态)

Blocked(阻塞状态)

Terminated(终止状态)


小小收藏家
7楼 · 2020-12-16 13:51

Java的线程生命周期有六种状态:

  • New(初始化状态)

  • Runnable(就绪状态)

  • Running(运行状态)

  • Blocked(阻塞状态)

  • Terminated(终止状态)

 

1.New(初始化状态)当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

2.Runnable(就绪状态):当调用线程对象的start()方法,线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了start()此线程立即就会执行;

3.Running(运行状态)当就绪状态中的线程获得了CUP执行资源,执行run()中的代码,这样的线程我们称为运行状态的线程。

4.Blocked(阻塞状态)处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态。线程的阻塞状态分为两种:

第一种,Waiting(无时间限制的等待状态)

这个状态下是不能分配CPU执行的。有三种情况会使得Running状态到waiting状态

  • 调用无参的Object.wait()方法。等到notifyAll()或者notify()唤醒就会回到Runnable状态。

  • 调用无参的Thread.join()方法。也就是比如你在主线程里面建立了一个线程A,调用A.join(),那么你的主线程是得等A执行完了才会继续执行,这是你的主线程就是等待状态。

  • 调用LockSupport.park()方法。LockSupport是Java6引入的一个工具类Java并发包中的锁都是基于它实现的,再调用LocakSupport.unpark(Thread thread),就会回到Runnable状态。

第二种,Timed_Waiting(有时间限制的等待状态):

其实这个状态和Waiting就是有没有超时时间的差别,这个状态下也是不能分配CPU执行的。有五种情况会使得Runnable状态到waiting状态

  • Object.wait(long timeout)。

  • Thread.join(long millis)。

  • Thread.sleep(long millis)。注意 Thread.sleep(long millis, int nanos) 内部调用的其实也是Thread.sleep(long millis)。

  • LockSupport.parkNanos(Object blocked,long deadline)。

  • LockSupport.parkUntil(long deadline)。

5.Terminated(终止状态):在我们的线程正常run结束之后或者run一半异常了就是终止状态!

注意有个方法Thread.stop()是让线程终止的,但是这个方法已经被废弃了,不推荐使用,因为比如你这个线程得到了锁,你stop了之后这个锁也随着没了,其它线程就都拿不到这个锁了!这不玩完了么!

所以推荐使用interrupt()方法。

interrupt()会使得线程Waiting和Timed_Waiting状态的线程抛出 interruptedException异常,调用interrupt()方法后,使得Running状态的线程再调用wait()、sleep()、jion()方法时抛出interruptedException异常,需要在catch中处理线程异常后的问题

 

如果Running状态的线程没有阻塞在I/O状态的话,那只能主动检测自己是不是被中断了,使用isInterrupted()。


1234567
8楼 · 2020-12-17 10:32

Java的线程生命周期有六种状态:

New(初始化状态)

Runnable(就绪状态)

Running(运行状态)

Blocked(阻塞状态)

Terminated(终止状态)


梵梵
9楼 · 2020-12-19 15:32

在Java 中,给定的时间点上,一个线程只能处于一种状态,上述图片中的这些状态都是虚拟机状态,并不是操作系统的线程状态。线程对象的状态存放在Thread类的内部类(State)中,是一个枚举,存在着6种固定的状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

相关问题推荐

  • 回答 3

    如果使用常量的方式,该对象将被存储在常量池(永久代)如果使用new的方式,该对象将被存储在堆

  • 回答 7

    同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。...

  • 回答 6

    通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待,比方说阻塞队列BlockingQueue就是为线程之间共享数据而设计的

  • 回答 16

            Vue.js是一款流行的JavaScript前端框架,一个用于创建用户界面的开源JavaScript框架,旨在更好地组织与简化 Web开发。        Vue所关注的核心是MVC模式中的视图层,同时,它也能方便地获取数据更新,并通过组件内部特定的方法实现...

  • 回答 9

    1、throw和throws两个都是Java语言中的关键字2、throw关键字是用来抛出异常对象,throws关键字是用来声明声明异常的类型3、throw只能抛出一个异常对象,throws可以抛出多个异常类型

  • 回答 4

    线程从创建到结束的一个过程就是线程的生命周期。在线程的生命周期中,有不同的状态来描述。状态的罗列:新建态:线程刚刚创建之后的状态就绪态:准备好了各种资源,等待cpu来临运行态:正在运行的状态阻塞态:线程休眠,IO,等到锁对象死亡态:线程正常执行...

  • 回答 4

    MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。

  • 回答 7
    已采纳

    里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一...

  • 回答 8
    已采纳

    心里有个预期,然后看看是以什么目的进这家企业工作,要是赚钱的话,那就多要点,要是学习的话,可以根据情况要一个能养活自己的价格。

  • 回答 4
    已采纳

    Java中有八种数据类型,基础数据类型分别是:byte,short,int,long,float,double,char,boolean,引用数据类型分别是:数组,类和接口。方法传参的时候我们有两种,一种是形式参数(定义方法时写的参数),一种是实际参数(调用方法时给的具体值)。首先...

  • 回答 15
    已采纳

    现在的架构很多,各种各样的,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等,还有很多。分布式架构其实就是分布式系...

  • 回答 10

    1、监控GC的状态使用各种JVM工具,查看当前日志,分析JVM参数的设置,分析堆内存快照和GC日志,根据实际的各区域的内存划分和GC的执行时间,判断是否需要进行优化2、分析结果、判断是否需要优化如果各项参数设置合理,系统没有超时的日志出现,GC频率也不高,...

  • 回答 6

    MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以...

  • 回答 6

    学vue应该要先学习javascript 的基础知识和用法。

  • 回答 8

    1、lambda是jdk8的新特性2、使用lambda的前提,必须是一个接口,接口只能有一个抽象方法3、Lambda 表达式的简单例子:// 1. 不需要参数,返回值为 5  () -> 5    // 2. 接收一个参数(数字类型),返回其2倍的值  x -> 2 * x    // 3. 接受2个参数(数...

没有解决我的问题,去提问