前言

我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的。今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术。

概念

我们先来了解下线程和进程的概念以及区别:

1、什么是进程

进程是计算机执行应用程序的执行动作。当你运行一个程序的时候也就是完成了一个进程的启动(比如启动微信或者QQ)。如图所示

2、什么是线程

线程是进程内独立运行的一个单位,而进程他可以由一个或者多个线程组成,但是一个线程只能对应一个进程。

如何创建线程

创建线程有继承Thread类、实现Runnable接口或者通过Callable和Future创建线程三种方法,具体创建过程如下。 本文来源于公众号:【Java学习提升】 专注于Java领域技术分享,Java知识体系学习、分享面试经验,让我们结伴而行,共同成长!

1、继承Thread类

下面我们通过代码来看下继承Thread类创建线程的具体步骤:

首先我们需要定义一个类来集成Thread类,继承过后需要重写Thread类的run()方法,代码如下:

然后我们调用该线程类对象的start()方法来启动线程,代码如下:

运行结果如下:

2、实现Runnable接口

我们还可以通过实现Runnable接口来创建线程类,具体如下:

首先我们需要创建一个类来实现Runnable接口,同样我们也需要重写run()方法

然后我们创建Runnable实现类的对象,把这个实现类的对象作为Thread类的target对象来创建线程,最后得到的Thread类的对象才是真正的线程对象,运行start()方法来启动线程

结果如下:

3、通过Callable和Future创建线程

首先创建一个类实现Callable接口,并且重写call()方法

然后使用FutureTask来包装MyCallable对象,同样和上面一样把FutureTask类的对象作为Thread类的target对象来创建线程并用start()方法来启动。

通过上面的例子我们发现,已经不是重写run()方法而是重写call()方法,并且还能自定义返回值,另外还有一个值得注意的问题是FutureTask实际上是实现了Runnable类并且也继承了Future接口,很显然FutureTask具有这两者的双重特征。

线程的生命周期

线程的生命周期包含新建状态、就绪状态、运行状态、阻塞状态和销毁状态等5个状态。

1、新建状态

我们使用new()方法,让它有自己的内存空间,这样new出来的就是线程的新建状态。

2、就绪状态

从上面的例子中可以看出,当我们调用start()方法时,就进入了就绪状态。注意这个时候线程不会立刻执行,而是等待CPU给他分配资源,当获得了CPU资源就开始执行,这个是面试官经常问的点。

3、运行状态

当线程获得CPU的资源时就进入了运行状态,这里我来重点说明一下运行状态的线程,面试官经常在这里做文章。

因为处于运行状态的线程是非常复杂的,它有可能会变成就绪状态、阻塞状态或者死亡状态。

当执行run()方法时,如果线程在运行过程中失去了CPU资源的时候(如调用yield()方法),该线程就会暂停运行,因为线程已经从运行状态变成了就绪状态。

那么通过哪些方式能让线程从运行状态变成就绪状态呢?

当正处在运行中的线程调用sleep方法时,会主动放弃占用的系统资源

当正处在运行中的线程调用一个阻塞式IO方法时,如果一直在等待该方法返回值的时候,那么就会造成线程被阻塞

调用yield()方法会暂停当前正在运行的线程

线程正在等待通知(notify)

调用了线程的suspend方法将该线程挂起

当然除了线程在运行状态变成就绪状态外,还能直接让运行状态的线程变成销毁状态,比如线程出现了异常或者调用了stop()、desyory()等方法。

4、阻塞状态

如果执行了sleep()方法,这时就会让线程进入阻塞状态,当然造成这种情况的不只是只有调用sleep方法,比如当等待I/O设备的时候也会造成线程进入阻塞状态。

5、销毁状态

当线程运行结束的时候,或者被强制终止的时候,线程就进入了销毁状态。当然还有我们上面提到的运行过程中发生异常的情况、JVM异常结束、调用了stop()、desyory()等方法都会使线程进入销毁的状态。注意处于销毁状态的线程是不能复活的,如果强制调用start()方法,则会抛出java.lang.IllegalThreadStateException异常。

下面附一张完整的线程生命周期图:

总结

希望通过本文能带大家更好的去了解线程技术、线程与进程的区别、线程的三个实现方法和他们的区别以及线程的生命周期,帮助大家在工作中能更好的去开发程序。

原创声明:本文为【Java学习提升】原创博文,转载请注明出处。

本文来源于公众号:【Java学习提升】 专注于Java领域技术分享,Java知识体系学习、分享面试经验,让我们结伴而行,共同成长

java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理相关推荐

  1. java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  2. java 字节码分析_手把手带你分析Java中的Class字节码文件

    分析Class文件的源码如下: package org.yuequan.klass; public private int m; public int inc(){ return m + 1; } } ...

  3. 线程销毁_多线程(2)-Java高级知识(9)

    前面有一篇文章写的是多线程的基本知识,以及线程实现的两种方式,一种是继承Thread类,另一种实现Runnable 接口,今天沿着前面的多线程,继续分享多线程的第三种创建方法,以及第三种创建方法的优势 ...

  4. java对对碰游戏设计报告_手把手带你用Java打造一款对对碰游戏(下篇)

    上篇文章介绍了对对碰游戏的理论部分和介绍了JLabel.JButton.JPanel.ImageIcon.JTextField.JProgressBar等组件的基本使用,介绍了进度条(JProgres ...

  5. 我的世界java无法安装包_手把手教你搭建java环境

    前文 由于一些历史原因,开发java程序需要技术人员自行搭建环境,而搭建环境对于新手来说并不友好,不像其他语言那般方便,现如今,为帮助想入门java却无法顺利搭建的同学,编写该教程,如果觉得本文有用, ...

  6. 【手把手带你学Java EE】多线程那些事,你了解了吗?

    [手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...

  7. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  8. java thread exit方法_实例分析Java终止线程和stop()方法

    Java终止线程实例和stop()方法源码阅读 了解线程 概念 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 线程特点 拥有状态,表示线程的状态,同一时刻中,JVM中 ...

  9. 多线程导出excel高并发_大牛带你深入java多线程与高并发:JMH与Disruptor,确定能学会?...

    前言 今天我们讲两个内容,第一个是JMH,第二个是Disruptor.这两个内容是给大家做更进一步的这种多线程和高并发的一些专业上的处理.生产环境之中我们很可能不自己定义消息队列,而是使用 Disru ...

最新文章

  1. ES单字段支持的最大字符数
  2. 【软件工程】数据流图 ( 数据字典 | 数据流图平衡原则 | 父图与子图平衡 | 子图内平衡 | 数据流图绘制原则 )
  3. flare3d_clone
  4. 网络基础知识_你家的网络是这么布线的吗?家庭网络布线基础知识普及!
  5. BitmapFactory.Options详解
  6. 那桃林深处最美的风景
  7. 静态include与动态include的区别
  8. [Android][Android Studio] Gradle项目中添加JNI生成文件(.so文件)
  9. Category底层原理实现
  10. 消防审批时限减了一半
  11. AMD发布23.2.1 新驱动 支持开年新作《魔咒之地》
  12. 使用IDEA如何将项目打包成war包
  13. 2022-2027年中国煤矿安全设备行业市场全景评估及发展战略研究报告
  14. 多元线性回归分析(Stata)
  15. 只允许电脑连接指定WIFI
  16. 过云锁php木马,绕过waf的另类木马文件攻击方法
  17. 模拟退火算法团簇matlab,基于模拟退火优化算法的二元团簇结构优化方法与流程...
  18. 大连理工大学概率与统计上机作业
  19. 函数闭包--JavaScript权威指南--基础篇4
  20. 杀毒软件的查杀病毒的原理以及木马、病毒的免杀伎俩(论杀或者不杀 )

热门文章

  1. 微服务、Kubernetes和无服务器之后,即将发生的……
  2. 云计算的概念 - 初识云计算知识专栏(1)
  3. 华为鸿蒙系统p40,华为鸿蒙OS系统正式亮剑!华为P40再次确认:双打孔+麒麟990+鸿蒙OS...
  4. 华为鸿蒙电脑操作系统测试版,华为鸿蒙测试版下载 华为鸿蒙测试版电脑版下载...
  5. KAFKA 集成 SpringBoot2 消息发送和消费消息(基础篇)
  6. vba上传指定文件ftp服务器
  7. html-下拉框、文本域、文件域
  8. qt编译实现简单的文本编译器有粘贴复制_qmake 时复制文件(自动在编译前做一些操作,且写在.pro文件里)...
  9. mysql图片字符集_MySQL字符集介绍及配置
  10. oracle读取表空间物理文件中数据,shell脚本读取oracle数据库数据写入到文件中