`
newspringwork
  • 浏览: 101370 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java线程-线程生命周期&相关方法

阅读更多

一、线程的生命周期

线程的生命周期大致分为下面几种

1.新建状态

一个线程对象创建后,该线程就处于新建状态,处于新生状态的线程有自己的内存空间。

 

2.就绪状态

新建状态的线程通过start()进入就绪状态。

处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。因为cpu的调度不一定是按照先进先出的顺序来调度的),等待系统为其分配CPU。

 

3.运行状态

等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。

 

4.阻塞状态

处于运行状态的线程在某些情况下,让出CPU并暂时停止自己的运行,进入阻塞状态。

在阻塞状态的线程不能进入就绪队列,只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。

以下情况会使线程进入阻塞状态

  • 线程调用sleep,暂时进入中断状态(不会释放持有的对象锁),时间到后等待系统分配CPU继续执行
  • 线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞
  • 试图获取一个对象的锁,但是该对象锁正被其他线程持有
  • 程序调用了线程的suspend方法将线程挂起
  • 线程调用wait,等待notify/notifyAll唤醒时(会释放持有的对象锁),注意这几个都是Object的方法

5.死亡状态

当线程的run()方法执行完,或者被强制性地终止(例如出现异常,或者调用了stop()、desyory()方法等等),就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

  

二、线程相关方法

Java提供了一些便捷的方法用于会线程状态的控制。

1.run & start

通过调用start启动线程,线程执行时会执行run方法的代码

2.sleep & yield

sleep-使当前线程暂停执行一段时间,但是并不会释放对象锁

yield-与sleep类似,只是不能由用户决定暂定多长时间,且只能让同优先级的线程有执行的机会

3.suspend & resume

suspend-线程进入阻塞状态,但不会释放锁。此方法已不推荐使用,因为同步时不会释放锁,会造成死锁的问题。

resume-使线程重新进入可执行状态

4.stop

不推荐使用,且以后可能去除,因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,由此可能造成数据的不完整(后面的代码没执行完就停止了),很难检查出问题所在

5.join

把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。

如线程A中,调用线程B对象的join(线程B不能为创建状态),线程A会等待线程B执行完毕后才继续执行。

6.wait & notify/notifyAll

这三个都是Object类的方法

wait-使得线程进入阻塞状态,会释放持有的对象锁,使得其他线程可以访问需要该对象锁的同步方法or同步块

notify-选择一个锁对象上wait的线程唤醒,使这个唤醒的线程继续执行,其他线程仍然是wait状态

notifyAll-唤醒这个锁对象上wait的所有线程

分享到:
评论

相关推荐

    Java多线程-线程的生命周期

    线程生命周期的终点是死亡状态。线程在以下三种情况下结束:`run()`方法执行完毕、执行过程中抛出未捕获异常或错误,或者调用已过时的`stop()`方法。 6. 等待(Waiting): 从JDK1.5开始,线程可以进入等待状态,这...

    430.428.JAVA基础教程_多线程-线程的生命周期(430).rar

    理解并熟练掌握Java线程的生命周期对于编写高效、安全的多线程程序至关重要,尤其是在处理高并发场景时。合理地设计和管理线程能够提高程序的性能,避免死锁、活锁和饥饿等问题,从而确保程序的稳定性和可靠性。

    JAVA线程高级-线程按序交替执行

    1. **线程的生命周期与状态**: - 线程有新建、就绪、运行、阻塞和死亡五种状态。了解这些状态有助于理解线程的执行流程。 - `Thread.sleep()`方法可以使当前线程进入阻塞状态,到指定时间后自动恢复。 - `join()...

    java线程生命周期详细讲解

    Java多线程生命周期的讲解,很详细,希望能帮到大家

    动力节点_Java基础视频教程210_线程-线程的生命周期

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    Java线程-第三版(CHM电子版)

    1. **线程基础**:首先,书中会介绍线程的基本概念,包括如何创建和启动线程,以及线程的生命周期状态。还会讲解Java中的`Thread`类和`Runnable`接口,以及它们在实现线程时的区别和应用场景。 2. **同步机制**:...

    Java多线程(二)、线程的生命周期和状态控制

    ### Java多线程之线程的生命周期和状态控制 #### 一、线程的生命周期 在Java中,线程的生命周期是指线程从创建到结束的整个过程。根据线程的状态变化,我们可以将线程的生命周期划分为以下几个阶段: 1. **新建...

    (完整版)Java程序设计任务驱动式教程-任务二十八-线程的生命周期与优先级(线程的状态与调度).ppt

    【Java线程生命周期与优先级】 在Java程序设计中,线程是程序执行的独立路径,它使得程序可以并发地执行多个任务。线程的生命周期包括五个基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked...

    北大Java--多线程

    - Java线程有优先级,通过`setPriority()`方法设置。线程调度策略可能依赖于操作系统的具体实现,但通常优先级高的线程会被优先调度。 5. **多线程的互斥与同步**: - 互斥是指在同一时刻,只有一个线程能访问...

    4初学Java多线程:线程的生命周期.pdf

    在探讨Java多线程和线程生命周期时,我们首先应该明确,Java多线程是Java语言支持并发编程的一个重要特性,其允许同时执行多个任务,以提高程序的执行效率和改善用户体验。Java中的每个线程都有自己的生命周期,由一...

    Java多线程-多线程知识点总结和企业真题

    - 线程的生命周期包括新建、可运行、阻塞、等待、限时等待和终止六个状态。 - **题2**:`Thread.sleep(long millis)`方法的作用是什么? - 让当前线程暂停执行指定的时间毫秒数,让出CPU给其他线程使用。 - **题...

    Java线程状态流转图

    Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...

    Java多线程-多线程相关概念

    此外,Java还提供了线程池(ExecutorService)来管理和控制线程的生命周期,以提高系统的效率和资源利用率。 总之,Java多线程技术是提高程序效率和响应性的关键手段,理解和掌握相关概念及实践技巧对于Java开发者...

    计算机后端-Java-Java核心基础-第20章 多线程 04. 线程的生命周期.avi

    计算机后端-Java-Java核心基础-第20章 多线程 04. 线程的生命周期.avi

    初学Java多线程线程的生命周期.pdf

    初学Java多线程线程的生命周期.pdf

    Java线程详解大全

    本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要。线程是程序中一个单一的顺序控制流,它在程序的上下文中运行,但具有独立的执行路径。多线程则是指在...

    java编程 ---线程

    程序是一组静态的代码,而进程是这些代码在内存中的动态执行实例,拥有独立的内存空间和生命周期。线程是进程内的执行单元,一个进程可以包含多个线程,它们共享同一内存空间,但拥有各自的执行上下文和堆栈。 **2....

    Java多线程-知识点梳理和总结-超详细-面试知识点.docx

    Java内存模型定义了变量的存储位置、变量的生命周期和变量的访问规则等。 Happens-Before Happens-Before是Java内存模型中的一种关系,用于描述两个操作之间的执行顺序关系。如果操作A Happens-Before操作B,那么...

    彻底明白Java的多线程-线程间的通信.doc

    最后,`ExecutorService`和`ThreadPoolExecutor`提供了一种管理线程池的机制,它们可以有效地调度和控制线程,提高系统资源利用率,并简化线程生命周期的管理。 总之,理解Java的多线程以及线程间的通信是开发高效...

    Java多线程机制(讲述java里面与多线程有关的函数)

    线程的生命周期始于新建,通过调用start()方法进入就绪状态,然后可能进入运行、阻塞或等待,最后在run()方法执行完毕后死亡。 9.2 Thread的子类创建线程: 创建线程的一种方式是创建Thread类的子类,并重写run()...

Global site tag (gtag.js) - Google Analytics