图解定时任务线程池

Java33

线程池概念

我们上篇文章分析了ThreadPoolExecutor,如果要用一句话说明它的主要优势,就是线程置换。还有Executors工具类,极大的简化了研发人员工作。

我用一个图重复描述下线程池概念。多生产-多消费模型。

  • 生产者将线程任务丢进线程池中,生产者就就结束了。
  • 线程池控制消费者消费元素,消费者可以是1个或者多个,取决于线程池参数corePoolSize和maxPoolSize设置。
  • 阻塞队列是用来装生产者丢进去的线程任务,如ArrayBlockingQueue,LinkedBlockingQueue,DelayedQueue等。如果生产者生产能力超过消费者消费能力,如果阻塞队列有长度限制并且超过队列长度线程池会执行饱和策略,如果队列没有长度限制,可也能出现OOM哦,因为线程任务可能把内存都撑爆了,这也是面试常考点哦!

详细概念可以翻看我上一篇文章《线程池面试必考问题》。

定时任务延时原理

还记得我们上面说的阻塞队列吗?定时任务线程池底层使用 DelayedQueue实现的,这种延迟队列有一个最大的特点: 按时出队列,大家都考过驾照吧,科目三考试的时候都是车上坐的是4个人,假设一个人考试需要花15分钟,那么考试学员队列看起来是这样的。

DelayedQueue底层需要实现 Delayed接口同时需要实现getDelay方法和compareTo方法,getDelay方法用于计算出队列时间,一旦小于0就会出队列;compareTo方法用于按触发时间从小到大排序。这就是Schedule线程池任务延时原理,如果需要看案例代码,请参考我文章《并发队列:PriorityBlockingQueue和DelayQueue案例使用》。

scheduleWithFixedDelay和scheduleAtFixedRate区别

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

Swagger框架

开发软件:IDEA 项目类型:SpringBoot的JavaWeb 官网:https://swagger.io/ 在线文档:https://swagger.io/docs/specification/...
Java

一个注解搞定SpringBoot接口定制属性加解密

前言 上个月公司另一个团队做的新项目上线后大体上运行稳定,但包括研发负责人在内的两个人在项目上线后立马就跳槽了,然后又交接给了我这个「垃圾回收人员」。 本周,甲方另一家制造商的监控平台扫描了我们项目的...
Java

多线程相关知识整理

java内存区域和内存模型是不一样的东西,内存区域是指Jvm运行时将数据分区存储,强调对内存空间的划分。而内存模型是定义了线程和主内存之间的关系,即JVM在计算内存中的工作方式,如果我们想要深入了解J...
Java

乐观锁与悲观锁

它总是假设最坏的情况。每次你得到数据时,你都会假设其他人会修改它。因此,每次获取数据时,都会锁定它。通过这种方式,如果有人想要获取数据,他们会阻止它,直到它获得锁(共享资源每次只被一个线程使用,其他线...
Java

ch05 Java方法

Java方法 何谓方法? System.out.println(); //类.对象.方法 Java方法是语句的集合,它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 ...
Java

线程池

为什么要使用线程池?什么是线程池?字面意思(他是一种基于池化思想管理和使用线程的机制,他将多个线程预先存储在一个池子中) 池化思想应用: 内存池:预先申请内存,提升申请内存速度,减少内存碎片. 连接池...
Java

失物招领网站

校园失物招领网站 | lijinghai 项目介绍 📖 👉基于Springboot+vue+uni-app的校园失物招领平台. 含平台主体PC端、微信小程序和web后台数据管理平台. 失物招领信息一览...
Java

JAVA多线程实战

由于项目上要和其他系统交互,而该系统采用同步接口,我们采用单线程调用,接收一条数据平均需要4~6s。而我们需要汇总近三个月的订单信息,大约一次有几千条数据,所以进行一次交互大概需要几百分钟。经过沟通后...
Java

设计模式 《head first 设计模式》

策略设计模式:strategy pattern 定义了算法族,分别封装起来,让他们之间可以互相替换。 此模式让算法的变化独立于算法的客户类 客户类,以 接口定义的 实例变量作其域,即,将部分属性 委托...
Java

玩SpringBoot踩的小坑~

SpringBoot想必都学过吧,但是隔段时间没怎么用,往往犯一些低级的错误!!! 今天做了一个springboot项目的小实验,但是项目启动后却怎么都访问不到页面; 就这么一个简简单单的contro...
Java

分析 java.util.LinkedHashMap

介绍 该实现与HashMap不同的是它维护一个双向链表,可以使HashMap有序。与HashMap一样,该类不安全。 结构 和HashMap的结构非常相似,只不过LinkedHashMap是一个双向链...