newFixedThreadPool的阻塞队列大小是没有大小限制的,如果队列堆积数据太多会造成资源消耗.newCachedThreadPool是线程数量是没有大小限制的,当新的线程来了直接创建,同样会造成资源消耗殆尽.在新建线程池的时候使用ThreadPoolExecutor创建,阻塞队列可以使用ArrayBlockingQueue,这个队列的源码很金典,锁是一个成员变量.成员变量在堆内存中局部变量在栈内存保存比较好用的线程池:guava封装了很多实用的工具 <dependency>   &l…
1,为什么要使用线程池:Executors 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互.在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即创建大量空闲的线程,程序将Runnable对象或Callable对象传给线程池,线程池就会启动1个空闲的线程来执行它们的run()或者call()方法, run()或call()方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一…
newFixedThreadPool()方法: 该方法返回一个固定数量的线程池,当一个新的任务提交时,线程池中若有空闲线程,则立即执行. 若没有.则新的任务被暂存在一个任务队列中,待线程空闲时,便处理在任务队列中的任务 newCachedThreadPool()方法: 该方法返回一个可根据实际情况调整线程数量的线程池.若多余一个任务的线程数量不确定,但若有空闲线程可以复用 则会优先使用可复用的线程.若所有任务均在工作,又有新的任务提交,则会创建新的线程处理任务.所有线程在当前任务执行完毕后,将返…
一.概述 在java doc中,并不提倡我们直接使用ThreadPoolExecutor,而是使用Executors类中提供的几个静态方法来创建线程池: 以下方法是Executors下的静态方法,Executors中所定义的 Executor.ExecutorService.ScheduledExecutorService.ThreadFactory 和 Callable 类的工厂和实用方法. Executors只是一个工厂类,它所有的方法返回的都是ThreadPoolExecutor.Sche…
例子: ExecutorService es = Executors.newFixedThreadPool(5); try { for (int i = 0; i < 20; i++) { Runnable syncRunnable = new Runnable() { @Override public void run() { log.info(Thread.currentThread().getName()); try { Thread.sleep(2000); } catch (Inter…
在研究Executors提供的线程池时自然会想到标题这个问题,既然已经有了newFixedThreadPool,为什么还要存在newSingleThreadExecutor这个方法.难道newFixedThreadPool(1)不是只有一个线程(Single Thread)的?本文将通过分析JDK中的相关源码回答这个问题. 源码分析 写JDK代码的大佬们早就预料到了我们会有此疑问,在newSingleThreadExecutor给我们解释了一下:Unlike the otherwise equi…
Java定时器相关Timer和TimerTask类 每个Timer对象相对应的是单个后台线程,用于顺序地执行所有计时器任务TimerTask对象. Timer有两种执行任务的模式,最常用的是schedule,它可以以两种方式执行任务:1:在某个时间(Data),2:在某个固定的时间之后(long delay),都可以指定任务执行的固定延迟(long period).另一种是scheduleAtFixedRate,它可以在1:在某个时间(Data),2:在某个固定的时间之后(long delay)…
本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然还有我个人的拙见,添加部分大多用不同颜色进行了区别以方便阅读. 前言 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.…
背景 公司业务性能优化,使用java自带的Executors.newFixedThreadPool()方法生成线程池.但是其内部定义的LinkedBlockingQueue容量是Integer.MAX_VALUE.考虑到如果数据库中待处理数据量很大有可能会在短时间内往LinkedBlockingQueue中填充很多数据,导致内存溢出.于是看了一下线程池这块的源码,并在此记录. 类图 Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数…
个人信息: 趁着中秋写个帖子记录一下吧.渣渣本,无实习,无高质量证书,走了很多弯路,最后选择的Java后端.现在算是半躺平了,接了几个中小厂的offer保底,20w多的薪资,后面还有几家公司接着面.不是大佬,还有很多比我厉害的双非战神!感谢很多前辈还有网友,让我白嫖了那么多的资源,趁着中秋假期,写篇文章总结一下.   大一大二划水: 大一学Unity3D做游戏开发,大二学CTF.渗透测试挖洞,都是跟着社团一起学的.我是在大二的暑假,意识到了自己的一些问题,决定选择Java后端的方向.这个时候我J…