自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

A minor

菩提本无树,明镜亦非台。本来无一物,何处惹尘埃

  • 博客(90)
  • 资源 (1)
  • 收藏
  • 关注

原创 【Zookeeper】应用场景:实现分布式锁

首先,我们需要明白一个问题,分布式锁是什么?同一个JVM进程内,多个线程同步执行 ==> synchronized,Lock等锁分布式下,不同JVM进程访问同一资源 ==> Redis,Zookeeper等中间件所以,一个多核CPU也可以认为是一个小型分布式系统,多核CPU的并发编程的问题也可以认为是微观的分布式锁问题。那如何通过 Zookeeper 实现分布式锁呢?1.同级节点唯一性1)因为Zookeeper的同级节点唯一性,所以多个进程来向zookeeper创

2021-02-28 23:33:18 224

原创 【Zookeeper】ZK 是干什么的?

1.zookeeper 是干什么的?Zookeeper 的前世今生:Apache ZooKeeper 是一个高可靠的分布式协调中间件。它是 Google Chubby 的一个开源实现,那么它主要是解决什么问题的呢?那就得先了解Google Chubby Google Chubby是谷歌的一个用来解决分布式一致性问题的组件,同时,也是粗粒度的分布式锁服务。1.1 分布式一致性问题什么是分布式一致性问题呢?简单来说,就是在一个分布式系统中,有多个节点,每个节点都会提出一个请求,但是在所有节点中只能确定一个

2021-02-28 22:30:57 1738 2

原创 【RabbitMQ】消息可靠性投递(四)Queue-->Consumer

如果消费者收到消息后没来得及处理就发生异常,或者处理过程中发生异常,会导致④失败。服务端应该以某种方式得知消费者对消息的接收情况,并决定是否重新投递这条消息给其他消费者。RabbitMQ提供了消费者的消息确认机制(message acknowledgement),消费者可以自动或者手动地发送ACK给服务端没有收到ACK的消息,消费者断开连接后,RabbitMQ会把这条消息发送给其他消费者。如果没有其他消费者,消费者重启后会重新消费这条消息,重复执行业务逻辑。1.自动ACK消费者默认采用的是自动ack(

2021-02-28 01:35:47 1729 5

原创 【RabbitMQ】消息可靠性投递(三)Queue存储消息

第三个环节是消息在队列存储,如果没有消费者的话,队列一直存在在数据库中。1.持久化到硬盘如果RabbitMQ的服务或者硬件发生故障,比如系统宕机、重启、关闭等等,可能会导致内存中的消息丢失,所以要把消息本身和元数据(队列、交换机、绑定)都保存到磁盘。@Bean("myQueue") // 队列持久化public Queue queue(){ //queueName,durable,exclusive,autoDelete,Properties returnnewQueue("MY_

2021-02-28 01:35:32 351

原创 【RabbitMQ】消息可靠性投递(二)Exchange->Queue

第二个环节就是消息从交换机路由到队列。在什么情况下,消息会无法路由到正确的队列?可能因为路由键错误,或者队列不存在。有两种方式处理无法路由的消息:一种就是让服务端回发给生产者一种是让交换机路由到另一个备份的交换机1.消息回发消息回发的方式:使用 mandatory 参数和 ReturnListenerpublic class ReturnListenerProducer { public static void main(String[] args) throws Exception{

2021-02-28 01:35:11 338

原创 【RabbitMQ】消息可靠性投递(一)Producer->Broker

第一个环节是生产者发送消息到Broker。可能因为网络或者Broker的问题导致消息发送失败,生产者不能确定Broker有没有正确的接收。 在 RabbitMQ 里面提供了两种机制服务端确认机制,也就是在生产者发送消息给RabbitMQ的服务端的时候,服务端会通过某种方式返回一个应答,只要生产者收到了这个应答,就知道消息发送成功了。第一种是Transaction(事务)模式,第二种Confirm(确认)模式。1.事务模式ACK通过channel.txSelect()方法把信道设置成事务模式,然后就可以

2021-02-28 01:34:28 1573 4

原创 【Spring】IOC&DI:核心流程小结

前篇:【Spring】重构–手写Spring核心逻辑(一)目标及框架结构【Spring】重构–仿写Spring核心逻辑(二)实现IOC/DI(beans包)【Spring】重构–仿写Spring核心逻辑(三)实现IOC/DI(context包)先来说一下我们要使用的容器 MYApplicationContext 的继承关系,它实现了 BeanFactory 接口和 AbstractApplicationContext 抽象类BeanFactory 接口:提供了 getBean(beanN.

2021-02-27 20:46:39 148

转载 【Spring】事务(下):使用示例(编程式、声明式、注解式)

原文链接:https://blog.csdn.net/weixin_43935927/article/details/110943178在 Spring 中使用事务有三种方式:编程式:在开发代码中通过 TransactionTemplate 直接开启、提交、关闭事务配置式:在 spring 配置文件中通过 tx 标签进行配置,然后借助 aop 实现注解式:在配置文件开启注解,然后在选用使用事务的方法上 @Transactional1.编程式事务管理public class OrdersS.

2021-02-27 16:22:05 312

原创 【Spring】IOC(下):实体 Bean 的基本配置(包括xml、注解)

在上一篇文章我们介绍了如何通过 xml 和 JavaConfig 去创建 bean,本篇我们来看看如何配置 bean 的一些基本信息。1.作用域类别说明singletonSpring IOC 容器中仅存在一份 bean 实例prototype每次都创建新的实例request一次 http 请求创建一个新的 bean,仅适用于 WebApplicationContextsession一个 session 对应一个 bean 实例,仅适用于 WebApplica

2021-02-27 16:09:00 166 1

原创 【数据结构】并查集:LeetCode题 547.朋友圈问题

547. 朋友圈班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。示例 1:输入: [[1,1,0], [1,1,0], [0,0,1]]输出: 2 说明

2021-02-26 01:59:03 647

原创 【必备算法】二分查找:LeetCode题(二)33. 搜索旋转排序数组,240. 搜索二维矩阵 II

33. 搜索旋转排序数组²假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例 2:输入: nums = [4,5,6,7,0,

2021-02-26 01:47:08 96

原创 【数据结构】散列表:LeetCode题(二)1. 两数之和,13. 罗马数字转整数

1. 两数之和¹给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]1.解法一:枚举法思路:没啥说的,就是枚举出所有结果复杂度Time:O(n^2),66msSpace

2021-02-26 01:37:06 114

原创 【数据结构】链表:LeetCode题(四)234.回文链表

234. 回文链表请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true解法一:栈思路:遍历链表,将所有节点压入栈,再遍历一遍进行对比注:栈里应该存的是val,而不是ListNode,因为比较的时候顺序是相反的,ListNode肯定都不相同。复杂度Time:O(n)Space:O(n),用了个Stackpublic boolean isPalindrome(ListNo

2021-02-26 01:32:40 62

原创 【数据结构】链表:LeetCode题(三)21.合并两个有序链表

21. 合并两个有序链表¹将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解法一:双指针(归并)思路:新建一个头,链表1,链表2比大小插入即可。就像归并排序中合并两个子数组一样。注:这里能这么做的前提一定是待合并的两部分是排好序的!!复杂度Time:O(m + n)Space:O(1)publ

2021-02-26 01:31:15 161

原创 【Java并发编程】并发:线程安全三要素及解决方案

1.可见性多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。解决方案1)JMM 提供了 volatile2.有序性若在本线程内观察,所有操作是有有序的若在一个线程观察另一个线程,所有操作时无序的在 JVM 中,为了效率允许编译器和处理器对指令进行重排序解决方案1)线程内:as-if-seria,单线程中重排序后不影响执行结果2)多线程:JMM 提供了 happens-before 规则程序顺序规则:一个线程中的每个操作,happens-befor

2021-02-25 17:21:04 484 5

原创 【Java并发编程】synchronized(二):通信 --一个容器问题

要求:实现一个容器,提供两个方法,add,size写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束1.方案一:volatilepublic class MyContainer<T> { // 复用 ArrayList // 注:这里使用 volatile 保证两个线程都能感知到修改 volatile List<T> list = new ArrayList<>(); // 使用 List

2021-02-25 15:39:56 149 4

原创 【JUC源码】锁:ReentrantLock(二)生产者消费者问题

在讲 synchronized 时候,我们使用 synchronized 实现了生产者消费者问题,本篇我们再使用 Lock 和 Condition 来实现。【Java并发编程】synchronized(一):生产者消费者问题对比两种方式,Condition 的方式可以更加精确的指定哪些线程被唤醒public class MyContainer03<T> { // 容器 LinkedList<T> list = new LinkedList<>();

2021-02-25 04:42:47 240

原创 【JUC源码】锁:ReentrantLock(一)基本使用及特性方法

1.Reentrantlock 基本使用reentrantlock 用于替代 synchronized,需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍)PS:使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放public class ReentrantLock1 { ReentrantLock lock = new ReentrantLock(); void m1(){ lock.

2021-02-25 04:34:30 326

原创 【Java并发编程】synchronized(一):同步 --生产者消费者问题

在文章的开头先明确几个概念:并发:多个线程同时操作同一个对象,并要修改其实例变量final 修饰的实例变量线程安全,因为不可变只能初始化一次锁:OS 的调度无法满足同步的需求,需要程序通过调度算法协助调度synchronized:JVM 级别锁Lock:api 级别synchronized:对象的锁,锁的代码通过只允许一个线程执行 sync 内代码,保证了可见性,有序性,原子性并发要求线程交替执行(时间片),而拿了锁会一直将任务执行完再释放(即使n时间片)Java 的

2021-02-25 04:17:19 268 2

原创 【Java并发编程】Java多线程(四):FutureTask 源码分析

前言:【Java并发编程】Java多线程(三):Runnable、Callable --创建任务的方式在上一篇文章的末尾我们通过两个问题,引出了 FutureTask 及其设计思路,先来回顾一下:问题一:Callable 与 Future都是接口,怎么实现通过 Future 控制 Callable 呢?答:可以创建一个中间类实现 Future接口,然后将 Callable 实例组合进来,最后通过 Future 接口中的方法实现控制。问题二:另外,这里还要考虑一个问题,Runnable 和 Cal.

2021-02-25 02:06:22 276

原创 【Java并发编程】synchronized(三):使用注意事项、死锁示例

在文章的开头先明确几个概念:并发:多个线程同时操作同一个对象,并要修改其实例变量final 修饰的实例变量线程安全,因为不可变只能初始化一次锁:OS 的调度无法满足同步的需求,需要程序通过调度算法协助调度synchronized:JVM 级别锁Lock:api 级别synchronized:对象的锁,锁的代码通过只允许一个线程执行 sync 内代码,保证了可见性,有序性,原子性并发要求线程交替执行(时间片),而拿了锁会一直将任务执行完再释放(即使n时间片)Java 的

2021-02-25 00:57:41 309 2

原创 【Java并发编程】synchronized(五):锁膨胀原理分析(JDK6后)

前言:【Java并发编程】synchronized(二):重量级锁原理分析(JDK6前)JDK6 为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”:锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。锁可以升级但不能降级。在对象头的 Mark Word 中保存了不同的锁状态:1.偏向锁特点:只有一个线程执行原理:CAS注:偏向锁在Java 6和Java 7里是默认启用的。由于偏向锁是为了在只有一个线程执行同步块时提高性能,如果你确定应.

2021-02-24 23:34:51 338 1

原创 【Redis】性能优化建议

1.使用连接池【推荐】 使用带有连接池的数据库,可以有效控制连接,同时提高效率,标准使用方式:JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(5); jedisPoolConfig.setMaxIdle(2); jedisPoolConfig.setTestOnBorrow(true);JedisPool jedisPool = new JedisPool(jedisP

2021-02-24 18:36:16 698

原创 【Redis】高阶使用(二):管道与 lua 脚本

1.管道(Pipeline)客户端可以一次性发送多个请求而不用等待服务器的响应,待所有命令都发送完后再一次性读取服务的响应。这样可以极大的降低多条命令执行的网络传输开销,管道执行多条命令的网络开销实际上只相当于一次命令执行的网络开销。需要注意到是用 pipeline 方式打包命令发送,redis 必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令越多越好。pipeline 中发送的每个 command 都会被 server 立即执行,如果执行失败

2021-02-24 17:22:08 439

原创 【Redis】高阶使用(一):几个高级命令

1.keys:全量遍历键keys & scan 这两个方法都用于key的模糊查询用来列出所有满足特定正则字符串规则的 key,当redis数据量比较大时,性能比较差,要避免使用keys *xxx // abcxxxkeys xxx* // xxxabckeys xx*xx //xxabcxx2.scan:渐进式遍历键scan (cursor) match (xxx *) count (limit)scan 参数提供了三个参数,第一个是 cursor 整数值,第二个是 key

2021-02-24 16:53:52 254

原创 【MySQL】基础使用(五):几条运行监控命令

1.查看运行线程:show processlistshow processlist;这是很重要的一个命令,用于显示用户运行线程。可以根据id号kill线程。也可以查表,效果一样:select * from information_schema.processlist;列含义Id线程的唯一标志,可以根据它 kill 线程User启动这个线程的用户,普通用户只能看到自己的线程Host哪个 IP 端口发起的连接db操作的数据库Command线程的

2021-02-24 00:52:34 233 1

原创 【MySQL】性能调优(五):架构。集群及分库分表

2.架构优化2.1 引入缓存在应用系统的并发数非常大的情况下,如果没有缓存,会造成两个问题:一方面是会给数据库带来很大的压力。另一方面,从应用的层面来说,操作数据的速度也会受到影响。我们可以用第三方的缓存服务来解决这个问题,例如Redis。运行独立的缓存服务,属于架构层面的优化。为了减少单台数据库服务器的读写压力,在架构层面我们还可以做其他哪些优化措施?2.2 主从复制如果单台数据库服务满足不了访问需求,那我们可以做数据库的集群方案。集群的话必然会面临一个问题,就是不同的节点之间数据一致性的问题

2021-02-24 00:45:48 426 1

原创 【MySQL】性能调优(六):业务层。减轻数据库压力

除了对于 SQL语句、表定义、架构、配置优化之外,业务层面的优化也不能忽视。举几个例子:在某一年的双十一,为什么会做一个充值到余额宝和余额有奖金的活动(充300送50)?因为使用余额或者余额宝付款是记录本地或者内部数据库,而使用银行卡付款,需要调用接口,操作内部数据库肯定更快。在去年的双十一,为什么在凌晨禁止查询今天之外的账单?这是一种降级措施,用来保证当前最核心的业务。最近几年的双十一,为什么提前一个多星期就已经有双十一当天的价格了?预售分流。在应用层面同样有很多其他的方案来优化,达到尽量减轻

2021-02-24 00:45:33 400

转载 【MySQL】left join、right join、inner join 区别对比

MySQL 的发展历史和版本分支:时间里程碑1996 年MySQL1.0 发布。它的历史可以追溯到 1979 年,作者 Monty 用 BASIC 设计的一个报表工具。1996 年 10 月3.11.1 发布。MySQL 没有 2.x 版本。2000 年ISAM 升级成 MyISAM 引擎。MySQL 开源。2003 年MySQL4.0 发布,集成 InnoDB 存储引擎2005 年MySQL5.0 版本发布,提供了视图、存储过程等功能。2008

2021-02-24 00:08:11 197 1

原创 【MySQL】事务与锁(六):死锁问题分析

在我们使用锁的时候,有一个问题是需要注意和避免的,我们知道,排它锁有互斥的特性。一个事务或者说一个线程持有锁的时候,会阻止其他的线程获取锁,这个时候会造成阻塞等待,如果循环等待,会有可能造成死锁。这个问题我们需要从几个方面来分析,一个是锁为什么不释放,第二个是被阻塞了怎么办,第三个死锁是怎么发生的,怎么避免。1.锁的释放与阻塞锁什么时候释放?事务结束(commit,rollback)或客户端连接断开。如果一个事务一直未释放锁,其他事务会被阻塞多久?会不会永远等待下去?如果是,在并发访问比较高的情况下

2021-02-24 00:07:44 721

原创 【MySQL】基础使用(一):支持的数据类型

建表原则:使用可以正确存储数据的最小数据类型。为每一列选择合适的字段类型:1.数值类型1.1 整型整数类型占用字节范围TINYINT1有符号:[-128,127] 或无符号:[0,255]SMALLINT2有符号:[-32768,32767]或无符号:[0,65535]MEDIUMINT3有符号:[-8333608,8388607]或无符号:[0,1677215]INT、INTEGER4有符号:[-21亿多,21亿多]或无符号:[0,42亿多.

2021-02-24 00:07:11 158

原创 【MySQL】存储引擎(四):InnoDB 磁盘结构(表空间)

磁盘结构里面主要是各种各样的表空间,叫做Table space。表空间可以看做是 InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。InnoDB的表空间分为5大类。1.system tablespace(系统表空间)在默认情况下 InnoDB 存储引擎有一个共享表空间(对应文件/var/lib/mysql/ibdata1),也叫系统表空间。InnoDB 系统表空间包含InnoDB数据字典和双写缓冲区,ChangeBuffer和UndoLogs),如果没有指定file-per-tab

2021-02-23 13:29:13 517

原创 【MySQL】存储引擎(二):InnoDB 内存结构

Innodb 的内存结构主要分为 3 个部分: Buffer Pool、Change Buffer、Adaptive HashIndex,另外还有一个(redo)log buffer。我们可到再官网看到 InnoDB 的内存结构和磁盘结构。1.Buffer Pool(缓存池)首先,InnnoDB 的数据都是放在磁盘上的,InnoDB 操作数据有一个最小的逻辑单位,叫做页(索引页和数据页)。我们对于数据的操作,不是每次都直接操作磁盘,因为磁盘的速度太慢了。 InnoDB使用了一种缓冲池的技术,也就是把磁

2021-02-23 13:28:52 471

原创 【MySQL】存储引擎(一):存储引擎介绍

首先来想一个问题,在关系型数据库里面,数据是放在什么结构里面的?答:放在表Table里面的,我们可以把这个表理解成Excel电子表格的形式。所以,我们的表在存储数据的同时,还要组织数据的存储结构,这个存储结构就是由我们的存储引擎决定的,所以我们也可以把存储引擎叫做表类型。在MySQL里面,支持多种存储引擎,他们是可以替换的,所以叫做插件式的存储引擎。为什么要搞这么多存储引擎呢?一种还不够用吗?这个问题先留着。1.查看存储引擎比如我们数据库里面已经存在的表,我们怎么查看它们的存储引擎呢?show t

2021-02-23 13:28:25 513

原创 【MySQL】运行原理(一):整体架构

原文链接:https://segmentfault.com/a/1190000017369618哈,好久没更新文章了,今天来说说关于mySQL那些年的小事。说到mySQL啊,用了挺久的了,但是有个问题一直在困扰着我,就是left join、join、right join和inner join等等各种join的区别。网上搜,最常见的就是一张图解图,如下:真的是一张图道清所有join的区别啊,可惜我还是看不懂,可能人比较懒,然后基本一个left join给我就是够用的了,所以就没怎么去仔细研究了,但是.

2021-02-23 11:41:06 279 1

原创 【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结

经过前几篇对 ThreadPoolExecutor 的源码分析后,我们再对 ThreadPoolExecutor 的关键信息做一些总结:1)线程池解决两个问题:通过减少任务间的调度开销 (主要是通过线程池中的线程被重复使用的方式),来提高大量任务时的执行性能提供了一种方式来管理线程和消费,维护基本数据统计等工作,比如统计已完成的任务数;2)线程池容量相关参数:coreSize:当新任务提交时,发现运行的线程数小于 coreSize,一个新的线程将被创建,即使这时候其它工作线程是空闲的,可以

2021-02-23 03:05:30 292

原创 【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析

1.execute()入口,选择执行策略,分为以下三种情况:情况一:工作线程 < 核心数 ,创建一个线程去执行任务情况二:工作线程 >= 核心数 且 任务队列未满,加入任务队列(等待核心线程来执行)线程池出现异常,删除当前任务极限情况:入队时可用线程刚好被回收,新建一个没有任务的线程情况三:任务队列已满队列已满 && 线程数 < maxSize:创建新的线程来处理任务队列已满 && 线程数 >= maxSize:使用 Reje

2021-02-23 03:05:14 255 1

原创 【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计及源码分析

Worker 设计思路照理说,线程池就是维持着许多线程,然后每个线程都可以很多任务。 但是这里注意一个问题,如果我们创建一个线程时直接传入一个具体的 Runnable,比如new Thread(new Runnable() { @Override public void run() { System.out.println("hello"); } }).start();那么,这个线

2021-02-23 03:04:46 279 4

原创 【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析

在文章开始之前,我们先要明白为啥要有线程池这么个东西。线程是一种稀缺资源,若不加以限制,不仅会占用大量资源,还会影响系统的稳定性。而线程池可以对线程的创建与停止、线程数量等等因素加以控制,使得线程在一种可控的范围内运行,在保证系统稳定运行的同时,还使得性能调优更加方便。另外,每次请求到来时,由于线程的创建已经完成,所以可以直接执行任务,减少了每次创建线程、销毁线程的开销,提高了响应速度。OK,下面我们就进入正戏,源码…ThreadPoolExecutor 核心继承关系,成员变量及主要构造函数:publ

2021-02-23 03:04:32 287

原创 【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析

在看 ThreadPoolExecutor 的源码前,我们先来看一下 ThreadPoolExecutor 的继承关系1.Executor定义 execute 方法来执行任务,入参是 Runnable,无出参public interface Executor { void execute(Runnable command);}2.ExecutorServiceExecutor 的功能太弱,ExecutorService 丰富了对任务的执行和管理的功能,主要代码如下:public i

2021-02-23 03:04:19 489

jdk8环境(解压即用)

jdk8,解压即用。

2020-09-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除