简速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 阅读 405 次 更新于 2025-09-10 18:54:38 我来答关注问题0
  • 1、新状态:线程对象已经创建,还没有在其上调用start()方法。2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。3、运行状态:线程调度程序...

  •  翡希信息咨询 java线程安全

    定义:相对的线程安全是指对象单独的操作是线程安全的,但在一些特定顺序的连续调用中,可能需要调用端使用额外的同步手段来保证调用的正确性。特点:Java语言中大部分的线程安全类都属于这种类型,例如Vector、HashTable以及Collections的synchronizedCollection()方法包装的集合等。四、线程兼容 定义:对象本身并...

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

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

  •  腾云新分享 java中实现runnable接口多线程技术,用五个线程,生成100个1到1000的随机数

    在Java中,使用Runnable接口实现多线程技术,可以有效提高程序的并发处理能力。下面是一个简单的例子,通过创建五个线程,每个线程生成1到1000之间的随机数。我们定义了一个名为Main的类,其中包含一个静态变量num,用于计数随机数的生成次数。在main方法中,我们创建了五个Thread对象,每个线程实例化了Random...

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

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

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

编程相关话题

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