简速java语言中线程对象都有哪些状态,这些状态如何变化

5、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。有关详细状态转换图可以参看本人的“Java多线程编程总结”中的图...
简速java语言中线程对象都有哪些状态,这些状态如何变化
线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。用一个图来描述如下:

1、新状态:线程对象已经创建,还没有在其上调用start()方法。

2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。

3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。

4、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。

5、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

有关详细状态转换图可以参看本人的“Java多线程编程总结”中的图

二、阻止线程执行
对于线程的阻止,考虑一下三个方面,不考虑IO阻塞的情况:
睡眠;
等待;
因为需要一个对象的锁定而被阻塞。

1、睡眠
Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。

线程睡眠的原因:线程执行太快,或者需要强制进入下一轮,因为Java规范不保证合理的轮换。

睡眠的实现:调用静态方法。
try { Thread.sleep(123); } catch (InterruptedException e) { e.printStackTrace(); }

睡眠的位置:为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠。

例如,在前面的例子中,将一个耗时的操作改为睡眠,以减慢线程的执行。可以这么写:

public void run() { for(int i = 0;i<5;i++){
// 很耗时的操作,用来减慢线程的执行// for(long k= 0; k <100000000;k++); try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); . } System.out.println(this.getName()+" :"+i); } }
2016-01-15
mengvlog 阅读 8 次 更新于 2025-07-19 08:41:38 我来答关注问题0
  • 1、新状态:线程对象已经创建,还没有在其上调用start()方法。2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。3、运行状态:线程调度程序...

  •  翡希信息咨询 java线程是什么意思?

    Java线程指的是Java多线程技术,即在一个进程中同时执行多个任务或子任务的能力。以下是关于Java线程的详细解释:线程独立性:在多线程环境中,每个线程都是独立运行的。它们拥有自己的程序计数器、堆栈、寄存器和线程局部变量等,但共享进程中的资源。线程创建:Java线程在使用时,通常通过Thread类或Runnable...

  •  翡希信息咨询 Java中线程的创建与使用、Thread类的常用方法

    Java中线程的创建与使用: 创建线程的方式: 继承Thread类:通过重写Thread类的run方法,然后创建Thread实例并调用start方法启动线程。 实现Runnable接口:实现Runnable接口的run方法,然后使用Runnable对象作为参数创建Thread实例,并调用start方法启动线程。Thread类的常用方法: 构造方法: Thread:创建一...

  •  翡希信息咨询 什么是线程??

    在Java中,线程可以看作是对一个对象的多次操作或指向,但这并不意味着线程是对对象的“拷贝”。一个对象可以开启多个线程,这些线程共享该对象的成员属性。因此,任何一个线程对成员属性的修改都会影响到其他线程。线程与对象的关系:与类创建多个对象类似,一个对象也可以开启多个线程。但不同的是,类...

  •  050970710 java多线程,每个线程中new同一个类,生成的对象相同,这是为何,这会造成共享变量的问题吧

    因为你的Obj没有实现equals和hashcode方法,然后当创建对象的时候,java底层给的是一套固定的顺序的hashcode,当你是多个线程创建的时候,所以会有相同的出现。当你的线程池是1的时候,就不会出现重复这个现象,同样你可以观察,你每次运行程序的时候,几乎都是那几个hash值出现。

檬味博客在线解答立即免费咨询

编程相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部