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月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
189 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
213 1
|
2月前
|
机器学习/深度学习 人工智能 监控
Java与AI模型部署:构建企业级模型服务与生命周期管理平台
随着企业AI模型数量的快速增长,模型部署与生命周期管理成为确保AI应用稳定运行的关键。本文深入探讨如何使用Java生态构建一个企业级的模型服务平台,实现模型的版本控制、A/B测试、灰度发布、监控与回滚。通过集成Spring Boot、Kubernetes、MLflow和监控工具,我们将展示如何构建一个高可用、可扩展的模型服务架构,为大规模AI应用提供坚实的运维基础。
268 0
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
3月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
Java 数据库 Spring
163 0
|
3月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
266 16
|
4月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
4月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
5月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
369 83

热门文章

最新文章