线程池概念
我们上篇文章分析了ThreadPoolExecutor,如果要用一句话说明它的主要优势,就是线程置换。还有Executors工具类,极大的简化了研发人员工作。
我用一个图重复描述下线程池概念。多生产-多消费模型。
- 生产者将线程任务丢进线程池中,生产者就就结束了。
- 线程池控制消费者消费元素,消费者可以是1个或者多个,取决于线程池参数corePoolSize和maxPoolSize设置。
- 阻塞队列是用来装生产者丢进去的线程任务,如ArrayBlockingQueue,LinkedBlockingQueue,DelayedQueue等。如果生产者生产能力超过消费者消费能力,如果阻塞队列有长度限制并且超过队列长度线程池会执行饱和策略,如果队列没有长度限制,可也能出现OOM哦,因为线程任务可能把内存都撑爆了,这也是面试常考点哦!
详细概念可以翻看我上一篇文章《线程池面试必考问题》。
定时任务延时原理
还记得我们上面说的阻塞队列吗?定时任务线程池底层使用 DelayedQueue实现的,这种延迟队列有一个最大的特点: 按时出队列,大家都考过驾照吧,科目三考试的时候都是车上坐的是4个人,假设一个人考试需要花15分钟,那么考试学员队列看起来是这样的。
DelayedQueue底层需要实现 Delayed接口同时需要实现getDelay方法和compareTo方法,getDelay方法用于计算出队列时间,一旦小于0就会出队列;compareTo方法用于按触发时间从小到大排序。这就是Schedule线程池任务延时原理,如果需要看案例代码,请参考我文章《并发队列:PriorityBlockingQueue和DelayQueue案例使用》。
scheduleWithFixedDelay和scheduleAtFixedRate区别
相关文章
Java(10)面向对象-使用LocalDate类完成日历设计
在我们完成这个日历设计前,需要了解Java中的预定义类 LocalDate的一些用法 LocalDate.now() // 2022-07-01 会构造一个新对象,表示构造这个对象时的日期。 Loca...
一个注解搞定SpringBoot接口定制属性加解密
前言 上个月公司另一个团队做的新项目上线后大体上运行稳定,但包括研发负责人在内的两个人在项目上线后立马就跳槽了,然后又交接给了我这个「垃圾回收人员」。 本周,甲方另一家制造商的监控平台扫描了我们项目的...
SpringCloud微服务实战——搭建企业级开发框架(三十一):自定义MybatisPlus代码生成器实现前后端代码自动生成
理想情况下,代码生成可以节省大量重复性和非技术性的工作量,代码生成可以按照统一的代码规范和格式生成代码,对日常代码开发有很大帮助。然而,代码生成也有其局限性,当涉及到复杂的业务逻辑时,简单的代码生成功...
ch05 Java方法
Java方法 何谓方法? System.out.println(); //类.对象.方法 Java方法是语句的集合,它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 ...
购买新电脑后必做的几件事(操作系统为Windows)
新买的电脑,无论是台式机,还是笔记本,买来之后,通常都有一些事情,是必须要做的,特别是 Windows 电脑。 以下详细描述: 1. 连上互联网,更新 Wiindows 系统。 主要原因是,自从 Wi...
键入网址到网页显示,期间发生了什么?
生成http请求信息: 请求行(请求方法字段、URL字段和HTTP协议版本)GET /index.html HTTP/1.1 消息头(key-value形式)User-Agent:产生请求的浏览器类型...
设计模式 《head first 设计模式》
策略设计模式:strategy pattern 定义了算法族,分别封装起来,让他们之间可以互相替换。 此模式让算法的变化独立于算法的客户类 客户类,以 接口定义的 实例变量作其域,即,将部分属性 委托...
玩SpringBoot踩的小坑~
SpringBoot想必都学过吧,但是隔段时间没怎么用,往往犯一些低级的错误!!! 今天做了一个springboot项目的小实验,但是项目启动后却怎么都访问不到页面; 就这么一个简简单单的contro...
分析 java.util.LinkedHashMap
介绍 该实现与HashMap不同的是它维护一个双向链表,可以使HashMap有序。与HashMap一样,该类不安全。 结构 和HashMap的结构非常相似,只不过LinkedHashMap是一个双向链...