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

365bfd7c805277da028f531a4133a5cb.png

前面有一篇文章写的是多线程的基本知识,以及线程实现的两种方式,一种是继承Thread类,另一种实现Runnable 接口,今天沿着前面的多线程,继续分享多线程的第三种创建方法,以及第三种创建方法的优势,前两种方法的弊端。并且介绍一种新的线程同步机制:lock锁的机制。

1. 实现线程的第三种方式:

实现 Callable 接口,重写 call 方法.

1d3db87a5cc800d69214a3be489c6808.png
图1. 实现Callable接口实现多线程

87e73bba5da082004c8c49b4575e2308.png
图2. 调用以及启动多线程

2. 继承Thread类,实现Runnable 接口实现多线程的弊端:

(1) 没有返回值

(2) 不支持泛型

(3) 异常必须处理

3. Callable 强大在哪里呢?

(1) Future 接 口 位 于 java.util.concurrent 包 中 ,可 以 对 具 体Runnable、Callable 任务的执行结果进行取消(cancel 方法,尝试取消执行此任务)、查询是否完成(isDone 方法)、获取结果(get 方法,等待完成,然后检索其结果)等。

(2) FutrueTask 是 Futrue 接口的唯一的实现类.

(3) FutureTask 同时实现了 Runnable, Future 接口。它既可以作为 Runnable 被线程执行,又可以作为 Future 得到Callable 的返回值.

16dc020d10e17e7e16332f07bc91574e.png
图3. Future接口

4. 线程同步的第三种方法:Lock锁。

Lock 锁:对需要上锁的地方上锁

1) JDK1.5 后新增的功能

2) 与 Synchronized 相比,Lock 可提供多种锁方案,更灵活

3) Java.util.concurrent.locks 中的 Lock 是一个接口,它的实现类是一个 Java 类,而不是作为语言的特性(关键字)来实现。

注意:如果同步代码有异常,要将 unLock()放到 finally 中。

4. 1 创建Lock锁的步骤。

(1) 创建 Lock 对象

(2) 调用 lock()方法上锁

(3) 调用 unlock()方法解锁

4.2 Lock 与 synchronized 的区别。

(1) Lock 是 显 示 锁 (手 动 开 启 和 关 闭 锁 ,别 忘 关 闭锁),synchronized 是隐式锁

(2) Lock 只有代码块锁,synchronized 有代码块锁和方法锁。

(3) 使用 Lock 锁,JVM 将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性(提供更多的子类)。

(4) Lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。lock()方法会对 Lock 实例对象进行加锁,因此所有对该对象调用 lock()方法的线程都会被阻塞,直到该 Lock 对象的 unlock()方法被调用。

5. 线程池。

5.1 什么是线程池?

创建和销毁对象是非常耗费时间的

创建对象:需要分配内存等资源

销毁对象 :虽然不需要程序员操心,但是垃圾回收器会在后台一直跟踪并销毁对于经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。

思路 :创建好多个线程,放入线程池中,使用时直接获取引用,不使用时放回池中。可以避免频繁创建销毁、实现重复利用。

5.2 线程池的好处.

(1) 提高响应速度(减少了创建新线程的时间)

(2) 降低资源消耗(重复利用线程池中线程,不需要每次都创建)

(3) 提高线程的可管理性:避免线程无限制创建、从而销毁系

统资源,降低系统稳定性,甚至内存溢出或者 CPU 耗尽

5.3 线程池的应用场合

(1) 需要大量线程,并且完成任务的时间短。

(2) 对性能要求苛刻。

(3) 接受突发性的大量请求。

6. 任务调度 度 Task_Timer和 ThreadLocal。

6.1 什么是调度?

任务:就是事情

调度:在不同的时间点或者在指定的时间点或者间隔多长时间我去运行这个任务。

类似于生活中的闹钟。

6.2 ThreadLocal.

ThreadLocal 直译为“本地线程”,其实它就是一容器,用于存放线程的局部变量

作用:为解决多线程程序的并发问题。

f9c5b936b20a146020f9244d4a6ba664.png
图4. ThreadLocal 的 的 API

谢谢大家,共同努力,共同进步。

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

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

相关文章

怎么查看服务器系统内存,怎么查看服务器系统内存

怎么查看服务器系统内存 内容精选换一换确认服务器服务是否开启。登录虚拟机内部。执行如下命令,查看系统的端口监听状态,如图1所示。netstat -ntplWindows虚拟机可以在命令行中执行netstat -ano查看系统的端口监听状态,或者查看服务端软件状…

as工程放到源码编译_Flutter源码剖析(二):源码的阅读与调试环境配置

综述 Flutter从架构上来说有3部分:用Dart写的Framework层,面向开发者用Java/Kotlin写的Embdder层(For Android,iOS是OC/Swift),纯Flutter App不需要关心用C写的Engine层,提供Dart运行环境和底层绘制能力针对每个部分&a…

workbook加载文件路径_【Python】文件重命名(按照Excel清单)

问题:1、扫描了很多文件,想批量加上文件编号2、网页下载了一堆图片,批量加上图片分类3、文件命名不规范,想批量调整效果图:需求解析:1、想重命名,就要有原名字和修改后的名字,清单准…

ppap文件过程流程图制作_收藏 | 据说PPAP的精华都在这个PPT里!一起来鉴定下

一组数字的PPAP3种情况必须提交8种情况通知提交5种提交等级3种提交状态18份提交内容“3”——以下3种情况,必须向顾客提交PPAP:1)一种新的零件或产品;2)对以前所提供不符合零件的纠正;3)由于设计记录、规范或材料方面的工程变更从…

++实现 ipv6数据报_IPV6报文格式和IPV4有什么区别?

前言RFC2460定义了IPv6数据报格式。总体结构上,IPv6数据报格式与IPv4数据报格式是一样的,也是由IP报头和数据(在IPv6中称为有效载荷)这两个部分组成的。但在IPv6数据报数据部分还可以包括0个或者多个IPv6扩展报头(Extension header)。正文1IPV6报文格式如…

曲面设计步骤pdf_3dmax模渲大师|室外设计师怎么用3dmax疯狂模渲大师制作室内设计效果图的外景天空?...

3dmax模渲大师|室外设计师怎么用3dmax疯狂模渲大师制作室内设计效果图的外景天空?这次食住玩讲的是第十三章的第1节,3dmax疯狂模渲大师室外设计篇的第1课——“外景天空”的使用方法。在室内设计效果图领域,也有要涉及室外的时候。…

iphone日历显示周视图_用敬业签记录放假安排 2021年放假安排日历

2021年已经踏着轻快的步伐向我们一路小跑而来,新的一年中,除了可以做更多的成绩之外,还有很多假期伴随而来。做好放假安排就可以让假期更加充实,为了能够更好的记录放假安排和相关事项可用敬业签这款便签软件。使用敬业签记录放假…

人工智能的炒作_为什么人工智能被过度炒作?

像任何新技术一样,人工智能也经历了称为“炒作周期”的各个阶段。它们从技术触发器开始。如果超过了人们设定的期望值(过度夸大),那么就会带来技术未达到预期的幻灭感,然后就是带来启发的成功案例,最后是生产力的稳定期。有了人工…

opencv轮廓周长原理_opencv轮廓逼近的精度参数与周长cvContourPerimeter的汇总

1)CV_Assert():若括号中的表达式值为false,则返回一个错误信息。函数原型是:#define CV_Assert( expr ) if((expr)) ; else cv::error( cv::Exception(CV_StsAssert, #expr, "", __FILE__, __LINE__) )2)cvContourPerimeter&#x…

mysql的所有聚合函数_MySQL 聚合函数(一)聚合(组合)函数概述

MySQL版本:5.7+ 一、MySQL 5.7中的聚合函数 MySQL 5.7中的聚合函数如下: 除非另有说明,否则组合函数会忽略NULL值。 如果在不包含Group By子句的语句中使用组合函数,就等效于对所有行进行分组。(个人理解是,结果总是只有一行。)关于这点的更多信息,后面的小节“MySQL处理…

mysql 转型_MySQL的未来在哪?

阿里云 MySQL&MariaDB 数据库产品结合开源社区,提供了稳定、可靠、便捷、弹性的在线数据库服务,帮助全球企业客户进行数字化转型。MySQL发展经历了一系列变化,从Sun到Oracle,发展也经过了几个阶段。MySQL从5.7版本开始走上了代…

mongoose换成mysql_如何将MongoDB数据库的数据迁移到MySQL数据库中

FAQ v2.0终于上线了,断断续续忙了有2个多月。这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见)、构建(前端、后台、数据库、服务器部署),也是第一次独立负责一个项目&#xff…

java虚拟机——JVM

JVM:java虚拟机,简称JVM,是运行所有java程序的假想计算机,是java程序的运行环境,是java最具吸引力的特征之一。我们编写的java代码,都运行在JVM之上。 跨平台:任何软件的运行,都必须…

mysql 5.0.37.tar.gz_Linux下MySQL5.0.37安装配置步骤

Linux下安装MySQL5.0.37需要以下面三个包:MySQL-client-community-5.0.37-0.rhel3.i386.rpmMySQL-server-community-5.0.37-0.rhel3.i386.rpmperl-DBI-1.53-2.fc7.i386.rpm(以下步骤需要root权限)1.验证是否已经安装过MySQLrpm -qa|grep MySQL如果发现有安装过,并需要卸载,使用…

JRE和JDK

JRE:是java程序的运行时环境,包含JVM和运行时所需要的核心类库。 JDK:时java程序开发工具包,包含JRE和开发人员使用的工具。 我们想要运行一个已有的java程序,那么只需要安装JRE即可。 我们想要开发一个全新的java程序…

java程序开发步骤

java程序开发步骤 开发环境搭建完毕后,可以开发第一个程序了 java程序开发三个步骤:编写,编译,运行。

thinkphp三级分销小程序源码_山东谷道微信小程序商城源码带后台 公众号平台三级分销系统...

山东谷道微信小程序商城源码带后台 公众号平台三级分销系统那么微信二级分销系统与微信三级分销系统到底有什么区别和联系呢?为什么改了个数字地位就天差地别?1、微信分销模式等级的区别用简洁的话来说,微信的三级分销系统包含了微信的二级分销系统,只…

linux mysql timestamp_MySQL时间类型Timestamp和Datetime 的深入理解

MySQL数据库常用的时间类型有timestamp和datetime,两者主要区别是占用存储空间长度不一致、可存储的时间也有限制,但针对不同版本下,timestamp字段类型的设置需要慎重,因为不注意的可能会被“坑死”。一、TIMESTAMP和DATETIME字段…

sql express 无法启动服务_在Windows2012下安装SQL Server 2005无法启动服务的解决办法...

因为安装了Windows2012操作系统,的确很不错,唯一的遗憾就是不支持Sql Server 2005的安装。找了很多办法,基本上都有缺陷。现在终于找到一种完全正常没有缺陷的办法了,和大家分享一下。1、正常安装任一版本的SQL Server 2005.2、安…

ecs php mysql集成环境_在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境...

阿里云的云服务器(ECS)可以选择多种操作系统,打算用它运行 Drupal或者 WordPress ,你最好选择 Linux 系统,这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器。我们在上面搭建一个 nginx mysql php-fpm 的环境,这就是常说的…