
JAVA_线程
发布日期:2021-05-04 13:33:20
浏览次数:18
分类:精选文章
本文共 2355 字,大约阅读时间需要 7 分钟。
==>线程的创建方式(继承Thread类与实现Runnable接口):
Thread类: Thread类中的常用方法包括start()方法、interrupt()方法、join()方法、run()方法等。其中start()方法与run()方法最为常用,start()方法用于启动线程,run()方法为线程实现功能的方法,可以根据需求覆写run()方法。
Thread类的构造函数有8个,但常用的只有4个,分别为:Thread thread=new Thread(); //无参的Thread类构造函数Thread thread=new Thread(Runnable simple); //参数为实现Runnable接口类对象的构造函数Thread thread=new Thread("ThreadName"); //参数为线程名称的构造函数Thread thread=new Thread(Runnable simple,"ThreadName");thread:Thread类实例化对象。simple:实现Runnable接口的类实例化对象。ThreadName:线程名称。
Runnable接口:
只有实现Runnable接口的类实例化的对象才可以称为线程,Thread类就是因为实现了Runnable接口所以才具有了线程的功能。 Runnable接口只有一个方法就是run()方法,实现Runnable()接口后必须覆写run()方法。==>两种创建线程方式的比较:
实现Runnble接口的优缺点分别如下:
从面向对象的角度来看,Thread类是一个虚拟处理机严格的封装,因此只有当处理机模型修改或扩展时,才应该继承该类。 由于Java 技术只允许单一继承,所以如果已经继承了Thread类,就不能再继承其他任何类,这会使用户只能采用实现Runnable接口的方式创建线程。继承Thread类的优缺点分别如下:
当一个run()方法体现在继承Thread的类中,用this指向实际控制运行的Thread实例,因此,代码不再需要使用如下控制:Thread.currenThread().sleep(),而可以简单地使用:Thread.sleep()。继承Thread类方式使代码变的简单易读。==>生命周期:
线程的4个主要周期状态是“创建”、“可执行”、“非可执行”和“消亡”,状态间的关系如图所示:
- 创建 当实例化一个Thread对象并执行start()方法后,线程进入“可执行”状态,开始执行,虽然多线程给用户一种同时执行的假象,但事实上在同一时间点上,只有一个线程在执行,只是线程之间转换的动作很快,所以看起来如同时执行一样。
- 可执行 当线程启用start()方法后,进入“可执行”状态,执行用户覆写的run()方法。当一个线程进入“可执行”状态下,并不代表它可以一直执行到run()结束为止,事实上它只是加入此应用程序执行安排的队列中,正如前文中提到的,这个线程加入了这个进程的线程执行队列中,对于大多数计算机而言,只有一个处理器,无法使多个线程同时执行,这时需要合理安排线程执行计划,让那些处于“可执行”状态下的线程合理分享CPU资源。所以,一个处在“可执行”状态下的线程,实际上可能正在等待取得CPU时间,也就是等候执行权,在何时给予线程执行权,则由Java虚拟机决定,同时也由线程的优先级来决定。
- 非可执行 在“可执行”状态下,线程可能被执行完毕,也可能没有执行完毕,处于等待执行权的队列中,当使线程离开“可执行”状态下的等待队列时,线程进入“非可执行”状态。可以使用Thread类中的wait()、sleep()方法使线程进入“非可执行”状态。 当线程进入“非可执行”状态下,CPU不分配时间片给这个线程,若希望线程回到“可执行”状态时,可以使用notify()方法、notifyAll()方法以及interrupt()方法。
- 消亡 当run()方法执行完毕后,线程自动消亡,当Thread类调用start()方法时,Java虚拟机自动调用它的run()方法,而当run()方法结束时,该Thread会自动终止。以前Thread类中存在一个停止线程的方法stop(),不过现在废弃了,因为调用这个方法,很容易使程序进入不稳定状态。
==>多线程产生死锁
因为线程可以阻塞,并且具有同步控制机制可以防止其他线程在锁还没有释放的情况下访问这个对象,这时就产生了矛盾。比如:线程A在等待线程B,而线程B又在等待线程A,这样就造成了死锁。 一般造成死锁必须同时满足如下4个条件:- 互斥条件 线程使用的资源必须至少有一个是不能共享的。
- 请求与保持条件 至少有一个线程必须持有一个资源并且正在等待获取一个当前被其他线程持有的资源。
- 非剥夺条件 分配的资源不能从相应的线程中被强制剥夺。
- 循环等待条件 第一个线程等待其他线程,后者又在等待第一个线程。
因为要发生死锁,这4个条件必须同时满足,所以要防止死锁的话,只需要破坏其中一个条件即可。
==>Java中交互方式分为同步和异步两种,异同情况如下:
同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程; 异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月22日 07时38分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python去除字符串中的特殊字符(爬虫存储数据时会遇到不能作为文件名的字符串)
2021-05-09
SpringCloud微服务(03):Hystrix组件,实现服务熔断
2021-05-09
Spring 框架基础(01):核心组件总结,基础环境搭建
2021-05-09
JavaEE基础(02):Servlet核心API用法详解
2021-05-09
SpringBoot2 整合Nacos组件,环境搭建和入门案例详解
2021-05-09
Sentry快速开始并集成钉钉群机器人
2021-05-09
Docker 服务
2021-05-09
Cassandra数据建模
2021-05-09
Elasticsearch Web管理工具
2021-05-09
在create-react-app创建的项目下允许函数绑定运算符
2021-05-09
评论表聚集索引引起的评论超时问题
2021-05-09
Internet Explorer 10 专题上线
2021-05-09
云计算之路-阿里云上:0:25~0:40网络存储故障造成网站不能正常访问
2021-05-09
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
2021-05-09
上周热点回顾(6.3-6.9)
2021-05-09
上周热点回顾(8.12-8.18)
2021-05-09
【故障公告】升级阿里云 RDS SQL Server 实例故障经过
2021-05-09
蹒跚来迟:新版博客后台上线公测
2021-05-09
上周热点回顾(9.16-9.22)
2021-05-09
上周热点回顾(11.4-11.10)
2021-05-09