多线程(进阶三:JUC)

一、Callable接口

二、reentrantLock

三、原子类

四、线程池

五、信号量 Semaphore

六、CountDownLatch

JUC即java.utill.concurrent,里面放了一些多线程编程时有用的类,下面是里面的一些类。

一、Callable接口

1、创建线程的操作

        多线程编程时,创建线程有以下五种操作:

1、继承Thread类(包含了匿名内部类的方式)

2、实现Runnable接口(包含了匿名内部类的方式)

3、基于lambda表达式

4、基于Callable接口

5、基于线程池

        为什么有那么多方式可以创建线程,前面三个创建线程很方便,也经常用,为啥还要学Callable接口创建线程的方式呢?答案是因为有它独特的优势和特性。

以下是Callable和Runnable的区别:

                Runnable关注的是这个的过程,也就是重新run方法里面的内容,它的返回值是void。

                Callable即关注过程,也关注结果,Callable提供call方法,返回值就是执行任务得到的结果。

2、编写多线程代码

创建一个线程,这个线程完成1+2+3+...+1000的任务,并打印出结果。

(1)实现Runnable接口(使用匿名内部类)

代码如下:

public class ThreadDemo1 {private static int sum = 0;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(new Runnable() {int result = 0;@Overridepublic void run() {for (int i = 1; i <= 1000; i++) {result += i;}sum = result;}});t.start();t.join();System.out.println("sum = " + sum);}
}

执行结果:

可以看到,用实现Runnable接口的代码可以完成任务,但并不优雅,因为要创建一个全局的静态变量,如果其他场景下使用Runnable接口,需要创建很多这样的变量,就容易混淆、记错这些变量的代指。

(2)实现Callable接口(使用匿名内部类)

代码如下:

public class ThreadDemo2 {public static void main(String[] args) throws ExecutionException, InterruptedException {Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= 1000; i++) {sum += i;}return sum;}};FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread t = new Thread(futureTask);t.start();int result = futureTask.get();System.out.println("result = " + result);}
}

执行结果如下:

和预期值一样。

实现Callable接口,没有创建变量也可以完成任务,通过call方法的返回值,输出我们想要的值。

注意:

1、这里的FutureTask,因为Thread里面的构造方法的参数没有Callable接口,但有FutureTask类,所以成为了Thread和Callable的粘合剂

2、FutureTask直接翻译的意思是:未来的任务那么未来的任务肯定没有执行完,最终取结果的时候就需要一个凭据,而futureTask就是凭据;就像我们吃麻辣烫的时候,付完款拿到的小牌子,当前工作人员没做完麻辣烫,需要做完后叫到我们的号才能取餐。

3、FutureTask的get方法有阻塞功能,如果线程没有执行完,get就会阻塞,等线程执行完了,return了结果,才会执行get方法返回值。

Callable是一个“锦上添花”的东西,Callable能干的事,Runnable也能干,但对于这种带返回值的任务,使用Callable会更好,代码更直观、简单,但需要理解这里FutureTask起到的作用。


二、reentrantLock

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

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

相关文章

Docker应用之daemon.json(一)

目录 问题复现原因分析解决步骤1.创建daemon.json2.国内镜像地址3.保存daemon.json4.重启docker服务5.查看镜像源问题小结官网docs提供的一个示例配置参数背景说明 问题复现 今天在用docker部署springboot项目时&#xff0c;出现JDK8依赖包下载失败&#xff0c; 原因分析 第一…

MySQL-----初识

一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…

LNMP环境搭建动态网站

一、环境准备 服务器&#xff1a;openEuler 22.03 Linux IPV4 &#xff1a;192.168.110.144/24 网页服务器&#xff1a;Nginx1.21.0 数据库&#xff1a;MySQL 8.0.36 PHP&#xff1a;8.0.30 1.安装软件 [rootnode3 ~]# yum install php-mysqlnd php php-gd php-fpm php-xml -y…

TRUNCATE TABLE和DELETE FROM对比

相同点:用于删除数据,同时保留表结构. 不同点: TRUNCATE比DELETE更快(数据量小可能体现不出来,单数据量大就很明显了) 原因:TRUNCATE是DDL(数据定义语言)DELETE是逐行删除属于(DML) TRUNCATE 不会产生大量日志,但DELETE删除会产生大量日志 DELETE FROM 可以加WHERE子句指定…

word调整论文格式的记录

页眉的分章显示内容 效果&#xff1a; 步骤&#xff1a; 确保“显示/隐藏的标记”符号打开点亮 前提是章节前面有“分节符&#xff08;下一页&#xff09;”&#xff0c;没有则添加&#xff0c;在菜单栏“布局”——》“下一页” 添加页眉&#xff0c;双击页眉&#xff0c;选…

Springboot-SpringCloud学习

文章目录 web项目开发历史 Springboot注解AAspectAutowiredAllargConstructorAround BBeanBuilder CConfigurationConditionalOnMissingBeanComponentComponentScan DDocumentedData EEnableWebSecurityEqualsAndHashCodeExceptionHandler FGGetter HIinterfaceInherited JKLLo…

⒒电子产品拆解分析-英语四六级耳机

⒒电子产品拆解分析-英语四六级耳机 一、功能介绍二、电路分析以及器件作用1、4054锂电池充电电路2、RDA5807FP收音机电路三、其它一、功能介绍 ①可接收FM50~108广播电台频率;②关机可备份当前接收的频率和音量;③内置锂电池可充电使用;④可接多功能线到手机或电脑当头戴耳…

Redis -- list列表

只有克服了情感的波动&#xff0c;才能专心致志地追求事业的成功 目录 列表 list命令 lpush lpushx rpush rpushx lrange lpop rpop lindex linsert llen lrem ltrim 阻塞命令 小结 列表 列表相当于 数组或者顺序表。 列表类型是用来存储多个有序的字符串&…

Java项目:基于SSM框架实现的教务管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm813基于SSM框架实现的教务管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#x…

Redis -- hash哈希

马行软地易失蹄&#xff0c;人贪安逸易失志。 目录 关于Redis的hash hash命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx hash计数 hincrby hincrbyfloat 小结 关于Redis的hash 几乎所有的主流编程语言都提供了哈希&#xff08;hash&a…

动态微信小程序码和开发者工具解析小程序码

一、动态生成微信小程序码 1、方式一 微信官方网站&#xff0c;对已发布的小程序&#xff0c;提供了一个快捷的入口&#xff0c;输入微信小程序的page页面即可。 page页面可以通过右侧开启入口获取 也可以通过开发者工具左下角的页面地址和参数地址那里获取到 二、生成的小…

【Java程序设计】【C00224】基于Springboot+vue的前后端分离的党员信息管理系统(论文)

基于Springbootvue的前后端分离的党员信息管理系统&#xff08;论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springbootvue的前后端分离的党建信息管理系统 本系统分为用户以及管理员2个角色。 用户模块管理&#xff1a;用户登录、用户注…