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

前言

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

概念

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

1、什么是进程

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

9158efcb2b14e351166a771035034a49.png

2、什么是线程

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

如何创建线程

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

1、继承Thread类

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

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

3b9c670156ec8906f0632d1041874120.png

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

7d1f2cedef2687660a29551265339a84.png

运行结果如下:

e1fed0b10baee977d5f7f8ce9ee370fc.png

2、实现Runnable接口

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

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

7ab8f71ced39ec7848942f4be4326386.png

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

e30f0fb8474f519cbb0129e86254f237.png

结果如下:

48315681e00b427506d2fb9078ca48dd.png

3、通过Callable和Future创建线程

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

9c89361c7ff261ab894cb549e067f9c2.png

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

c3f54e09fe003156dcc248030454c04a.png

通过上面的例子我们发现,已经不是重写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异常。

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

faad995d9c207c25d1f58cc797cfdb6f.png

总结

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自动化_python自动化测试-Behave框架的用法介绍 - python测试学习

测码学院 Behave框架的用法介绍众所周知:行为驱动开发((behavior-drivendevelopment,BDD)是一种基于敏捷软件开发的方法。它可以鼓励开发人员,业务参与者和QA人员之间的协作。作为另一个Python自动化测试框架,“Behave”允许团队…

虚拟按键自己触发的java代码_在SystemUI添加虚拟按键

我们想要在volume、back、menu同一排添加一个虚拟按键,并且触发一个应用;1、首先我们要找到这些虚拟按键的位置:\frameworks\base\packages\SystemUI\res\layout-sw600dp\navigation_bar.xml2、横屏时,最左边的RelativeLayout 中添…

diskgeniusv4.4.0_入门TensorFlow2.0

今天老师带领我们入门TensorFlow2.0。至于tensorflow2.0是啥嘛,详细的可以度娘一下。我简述一下,就是一个end-to-end machine-Learning open source plantform(端对端的开源机器学习的平台)。学习tensorflow需要引入tensor这个概念,tensor的汉语意思就是…

java.close用法_void close()

void close()描述 (Description)java.io.FilterInputStream.close()方法关闭此输入流并释放与该流关联的所有系统资源。声明 (Declaration)以下是public void close()方法的声明 -public void close()参数 (Parameters)NA返回值 (Return Value)该方法不返回任何值。异常 (Excep…

php 其他页面获取session_PHP五十个提升执行效率的小技巧,和常见问题

在项目开发过程中,经常遇到了一些PHP处理程序性能底下的情况,程序运行在centosnginx环境,虽然这个有很多的原因如:服务器本身配置,运行环境nginx服务,php-fpm配置等等,更多有一点仍然是PHPer没有…

java怎么设置404界面_如何使用Spring MVC显示自定义的404 Not Found页面

本篇文章给大家带来的内容是关于如何使用Spring MVC显示自定义的404 Not Found页面,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。不知道大家对千篇一律的404 Not Found的错误页面是否感到腻歪了?其实通过很简单…

蓝牙解码格式哪个最好_拆解报告:山灵UP2 蓝牙音频接收器

主流手机逐步取消3.5mm接口,不再内置解码芯片,习惯使用有线耳机、对音质有一定要求的朋友只能选择音频转换线或者蓝牙耳机功率放大器这类产品替代。与转换线相比,蓝牙耳机功率放大器采用蓝牙无线连接更加自由,体积一般也比较小巧。…

java spring mvc json ajax 优势_SpringMVC后台json数据前台ajax获取不到!!!急求解答!!!...

//后端RestControllerRequestMapping(value "/loan")public class LoanApplyController extends BaseController {Resourceprivate LoanApplyService loanApplyService;//购车申请审核模块RequestMapping(value "apply/all", method RequestMethod.GET)…

项目助理这个工作怎么样_分析微信清理僵尸粉这个项目怎么样?

做微信清理僵尸粉做微信清理僵尸粉做微信清理僵尸粉本人利用这个方式一年副业赚了10万01 项目介绍(为什么这个项目受欢迎)现在每个人几乎都会用到微信,但是时间长了,微信好友都是几百上千好友(5000是上限)了。但是你有没有发现,每次跟你微信沟…

php后台闪退,详解Cscms V4程序网站后台登陆出现闪退

最近无忧主机php空间有些站长在使用Cscms V4程序建站,登陆网站后台的时候出现了闪退的问题,这个问题困惑了很多使用这程序的站长们,因为出现这样的问题不只是单纯的Cscms程序才会出现,比如说Dedemcs、Wordpress等等蛮多的程序同样…

java 线程安全list_JAVA并发编程实战-线程安全性

线程安全性:对象的状态是指存储在状态变量(例如实例和静态域)中的数据。对象的状态可能包括其他依赖对象的域。例如:某个HashMap的状态不仅存储在HashMap对象本身,还存储在许多Map.Entry对象中。“共享”意味变量可以由…

日文转换为罗马音_手把手教你掌握韩语40音!入门必备哦

其实学习韩语还是蛮简单的,平时看韩剧也能学会几句比较常用的话~那么接下来我们进入正题,首先你可以根据自己的韩语学习经验和全网搜集,整理出以下能够快速学习韩语40音的方法,希望能帮助到更多面对韩语40音迷茫无措的…

php asp 发起post请求,PHP用curl函数POST请求到ASP页面提示无效请求

如题,一提交即返回以下信息:错误您所请求的网址(URL)无法获取——————————————————————————–当尝试进行以下请求时:POST /card/pay_card.aspx HTTP/1.0Host: pay.m3guo.comX-Real-IP: 120.31.66.99X-Forwarded-For:…

win7一直显示正在启动_win7系统中提高启动速度并且禁用某些软件启动的操作小技巧...

我们在启动系统时,会出现启动速度过慢,甚至达到假死机状态,就是鼠标一直在转圈圈的等待状态。出现这个问题,一般是我们电脑中自启动的软件过多造成的,解决这个问题我们只要进入系统配置工具中,对系统进行相…

站怎么点都是一样_抖音怎么做?这几样一样都不能少,你都做到了吗?

有人说去年是内容爆发年,也有人说今年是内容元年,其实不管哪年都好,反正电商平台是越来越倾向于内容化运营,包括618都对入场商家的内容化运营有要求,特别是短视频内容。下面就给大家分享一下如何去做好一个抖音账号。分…

栈 php 验证格式,表单验证 - 《Biny - 高性能轻量级PHP框架》 - 书栈网 · BookStack...

表单验证框架提供了一套完整的表单验证解决方案,适用于绝大多数场景。表单验证支持所有类型的验证以及自定义方法简单示例:namespaceapp\form;usebiny\lib\Form;/*** property \app\service\testService $testService* 自定义一个表单验证类型类 继承For…

只能获取fixed语句初始值_因用了Insert into select语句,美女同事被开除了!

点击上方 web项目开发,选择 设为星标优质文章,及时送达--Insert into select请慎用。这天xxx接到一个需求,需要将表A的数据迁移到表B中去做一个备份。本想通过程序先查询查出来然后批量插入。但xxx觉得这样有点慢,需要耗费大量的网…

python获取excel数据进行判断输出结果到excel,如何使用python xlrd/xlwt从一个excel工作簿提取数据并输出到另一个excel工作簿?...

我正在为xlutils、xlrd和xlwt创建一个名为excel functions的类,最终我可能会创建一个库。如果你有兴趣帮我做一个删除工作表的功能。您可能希望转向openpyxl和/或pyexcel,因为它们更容易实现,并且有相应的功能。如果要从一个excel工作簿提取数…

php中sql格式化字符串,sqli注入-sprintf格式化字符串带来的注入隐患

PHP中 sprintf()格式化输出详解sprintf()函数把格式化的字符串写入变量中。arg1、arg2、参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个%符号处,插入arg1,在第二个%符号处,插入arg2,以此类推。注释:如…

mybatis依赖_这大概就是公司一直用Mybatis的原因!真的太强了

01 什么是MyBatis、Spring?MyBatis是什么?它是一个SQL Mapping框架,它是一个持久化技术框架。再说得简单一点,它只不过是一个操作数据库的框架。Spring是什么?Spring就是一个大容器,不管是IoC还是AOP&#…