Java线程的生命周期与常见函数

简介: 我人生中第一次面试最让我印象深刻的问题就是线程的生命周期,因为当时校招准备的也不到位根本没背八股文,导致答的一塌糊涂。。。今天来总结一下。

Java相关文章


线程的生命周期

  1. 新建 -> 就绪 -> 运行 -> 阻塞 -> 死亡
  2. 新建
  1. 实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态
  1. 就绪
  1. 可运行状态只是说你资格运行,调度程序没有挑选到你,你就永远是可运行状态。
  2. 调用线程的start()方法,此线程进入可运行状态。
  3. 当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
  4. 当前线程时间片用完了,调用当前线程的yield()方法,当前线程从运行状态进入就绪状态。
  5. 锁池里的线程拿到对象锁后,进入可运行状态。
  1. 运行
  1. 线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
  1. 阻塞
  1. 当前线程T调用Thread.sleep()方法,当前线程进入阻塞状态。
  2. 运行在当前线程里的其它线程t2调用join()方法,当前线程进入阻塞状态。
  3. 等待用户输入的时候,当前线程进入阻塞状态。


Thread常用方法

  • Thread.currentThread() 返回当前执行的线程对象引用
  • Thread.yield() 让步操作,让当前线程从正在运行状态变为就绪状态
  • Thread.sleep() 让当先线程失眠
  • Thread.start() 启动线程,线程进入就绪状态,虚拟机调度执行run方法
  • Thread.run()  run方法只是thread普通的方法,由jvm调用
  • Thread.interrupt中断线程
  • Thread.join 阻塞到线程执行完成
  • setDaemon设置是否为守护线程


Thread.join()方法

  1. Thread中的join方法主要的作用是让join的线程加入当前线程,等加入的线程执行完之后才会执行当前线程。
  2. 本质上调用的Object.wait()实现现成的阻塞,所以Join方法被synchronize修饰。
  3. Join方法阻塞的是主线程,最终join的方法执行完通过notifyAll唤醒


Thread.start()与Thread.run()的区别

  1. start用来启动线程,线程进入就绪状态
  2. run方法只是thread普通的方法,在主线程里运行
  3. 线程的run方法是虚拟机直接调用的,如果没有运行线程(运行start方法) 而是在应用代码中直接调用了run方法,那么其实这个线程是运行在当前线程(调用run方法的那个线程中)违背了多线程初衷


wait()与sleep()的区别

  1. sleep方法是Thread类的方法,wait是object的方法
  2. sleep不释放锁,wait方法释放锁
  3. sleep必须捕获异常 ,wait不用捕获


怎么停止线程

  1. 在 run() 方法执行完毕后,该线程就终止了,设置好结束标志
  2. stop()方法
  1. 调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
  2. 调用 stop() 方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。
  1. interrupt()终端异常
  1. 正确停止线程的方法
  2. 不会立刻停止异常,而是打上停止标记



如何控制多个线程按顺序执行

  1. 利用并发包里的Excutors的newSingleThreadExecutor产生一个单线程的线程池,而这个线程池的底层原理就是一个先进先出(FIFO)的队列。代码中executor.submit依次添加了123线程,按照FIFO的特性,执行顺序也就是123的执行结果,从而保证了执行顺序。
  2. join方法,join方法让当前执行线程阻塞直到调用join方法的线程结束运行
相关文章
|
2天前
|
Java 索引
String字符串常用函数以及示例 JAVA基础
String字符串常用函数以及示例 JAVA基础
|
4天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。
|
2天前
|
缓存 安全 Java
7张图带你轻松理解Java 线程安全,java缓存机制面试
7张图带你轻松理解Java 线程安全,java缓存机制面试
|
3天前
|
存储 Java
【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质
【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质
17 4
|
1天前
|
存储 安全 Java
Java多线程基础知识总结,36岁老码农现身说法
Java多线程基础知识总结,36岁老码农现身说法
|
2天前
|
Java 测试技术
Java多线程的一些基本例子
【5月更文挑战第17天】Java多线程允许并发执行任务。示例1展示创建并启动两个`MyThread`对象,各自独立打印"Hello World"。示例2的`CounterExample`中,两个线程(IncrementThread和DecrementThread)同步地增加和减少共享计数器,确保最终计数为零。这些例子展示了Java线程的基本用法,包括线程同步,还有如Executor框架和线程池等更复杂的用例。
9 0
|
2天前
|
Java
阅读《代码整洁之道》总结(1),java多线程面试
阅读《代码整洁之道》总结(1),java多线程面试
|
2天前
|
Java Kotlin
关于Java:public函数公开其public / * package * /’参数类型
关于Java:public函数公开其public / * package * /’参数类型
10 3
|
3天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第15天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将通过实例分析,理解线程安全的重要性,并学习如何通过各种技术和策略来实现它。同时,我们也将探讨如何在保证线程安全的同时,提高程序的性能。
|
3天前
|
消息中间件 并行计算 Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第15天】 在现代计算机编程中,多线程是一个复杂但必不可少的概念。特别是在Java这种广泛使用的编程语言中,理解并掌握多线程编程是每个开发者必备的技能。本文将深入探讨Java中的多线程编程,从基础概念到实际应用场景,为读者提供全面的理论支持和实践指导。