一、线程池:
Executors是创建线程池的工厂方法,首先看Executors的所有方法:其中有三个比较常用:
以上三个方法返回的对象不同,其实看看源码就清楚了:
public interface ScheduledExecutorService extends ExecutorService { ScheduledFuture<?> schedule(Runnable arg0, long arg1, TimeUnit arg3); <V> ScheduledFuture<V> schedule(Callable<V> arg0, long arg1, TimeUnit arg3); ScheduledFuture<?> scheduleAtFixedRate(Runnable arg0, long arg1, long arg3, TimeUnit arg5); ScheduledFuture<?> scheduleWithFixedDelay(Runnable arg0, long arg1, long arg3, TimeUnit arg5); }
一、线程池执行如下:有新任务——>在corePoolSize范围内新增线程处理任务——>corePoolSize满,则放入任务队列——>队列满,则在maximumPoolSize范围内新增线程处理任务——>队列满,报错抛异常
二、newFixedThreadPool(int arg)和newSingleThreadScheduledExecutor()线程池结构:
1)先看下newFixedThreadPool(int arg)固定线程数的线程池源码,证明corePoolSize和maximumPoolSize相等,因为任务队列是无界的,所以一般不会用到最大线程参数,跟corePoolSize数量一样即可。
public static ExecutorService newFixedThreadPool(int arg) { return new ThreadPoolExecutor(arg, arg, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); }
其中ThreadPoolExecutor构造方法为:
public ThreadPoolExecutor(int arg0, int arg1, long arg2, TimeUnit arg4, BlockingQueue<Runnable> arg5, ThreadFactory arg6, RejectedExecutionHandler arg7) { this.ctl = new AtomicInteger(ctlOf(-536870912, 0)); this.mainLock = new ReentrantLock(); this.workers = new HashSet(); this.termination = this.mainLock.newCondition(); if(arg0 >= 0 && arg1 > 0 && arg1 >= arg0 && arg2 >= 0L) { if(arg5 != null && arg6 != null && arg7 != null) { this.corePoolSize = arg0; this.maximumPoolSize = arg1; this.workQueue = arg5; this.keepAliveTime = arg4.toNanos(arg2); this.threadFactory = arg6; this.handler = arg7; } else { throw new NullPointerException(); } } else { throw new IllegalArgumentException(); } }
2)newSingleThreadScheduledExecutor()可简单的理解只有一个线程的调度线程池。可以看到其实还是使用的ThreadPoolExecutor类对象,虽然有点区别,但大致可以理解为newFixedThreadPool(int arg)。
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
三、newScheduledThreadPool(int arg)线程池结构:
先看源码:其中队列使用的是DelayedWorkQueue(详见线程池总结2),定时调度任务由此队列实现:该queue同时具有PriorityQueue(优先级大的元素会放到队首)和DelayQueue(队列里第一个元素的getDelay返回值大于0时,则take调用会阻塞)的功能
public ScheduledThreadPoolExecutor(int arg0) { super(arg0, Integer.MAX_VALUE, 0L, TimeUnit.NANOSECONDS, new ScheduledThreadPoolExecutor.DelayedWorkQueue()); }
四、拓展:
像newCachedThreadPool()这种,用SynchronousQueue这种队列,即消费者生产者模式,队列里同时最多存在一个任务,被取走后新开一个线程任务处理(线程最大数为Integer最大值),才能再添加进来新的。
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue()); }
五、对比:
1、newFixedThreadPool 和 newSingleThreadExecutor: 请求处理队列可能会耗费无限大的内存。
2、newCachedThreadPool 和 newScheduledThreadPool: 因为线程最大数是 Integer.MAX_VALUE,也会耗费无限大内存。
六、execute和submit:
JDK5往后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,它们的区别是:
execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。——实现Runnable接口
submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。——实现Callable接口
相关推荐
vc++多线程实例、线程池原理及实例相关资料汇总大全
支持在线程池中线程耗尽的情况下,将线程池中所有线程当前正在执行那条代码的信息汇总,作为异常信息抛出, 同时将线程全部的完整堆栈信息保存到用户目录下的 "线程名.detail" 文件中,方便定位及排查线程池耗尽时的...
多线程并行执行,汇总结果、多线程并行执行,汇总结果
1.DBSqlMan是多线程访问mysql的动态库 2.mysql5,开源的windows下使用的mysql2次开发库,mysql官网上可以下载 3.testDb,简单的应用DBSqlMan的例子 整个工程已经在VS2005下运行通过,并在实际应用中使用过。提供了...
BATJ面试题汇总及详解65页 JAVA面试题汇总 线程池的原理,为什么要创建线程池?创建线程池的方式? 说说线程安全问题,什么是线程安全,如何实现线程安全? 创建线程池有哪几个核心参数? 如何合理配置线程池的大小...
线程、多线程和线程池面试专题 Android面试中常被问基础知识点汇总宝典 初级面试专题(中小厂) 混合跨平台开发面试题 设计模式面试专题及答案 中高级专题(View+Handler+Binder) 底层机制突破 面试必备之乐观锁与...
JDBC技巧汇总.pdf 个人整理的多项关于jdbc的相干技术文件以及线程池 批量插入 批量修改 批量查询 等
bat面试题之内置对象和四大作用域和页面传值、bat面试题之设计模式和常用的设计模式、bat面试题之实现一个拷贝文件的类使用字节流还是字符串、bat面试题之说说你对Servlet的理解、bat面试题之线程并发库和线程池的...
什么是线程池 如何实现 Array 和 List 之间的转换 普通类和抽象类有哪些区别 为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object 类里 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么 ...
如网络下载,多线程与线程池的管理,数据库ORM,图片缓存管理,图片文件下载上传,Http请求工具,常用工具类(字符串,日期,文件处理,图片处理工具类等),能够使您的应用在团队开发中减少冗余代码,很大的提高了...
1.线程、多线程和线程池面试专题 2.BAT Android面试20题详解 3.设计模式面试专题及答案 4.2019Android面试 常见58题 5.初级面试专题(中小厂) 7.设计模式面试专题 8.数据结构面试专题 9.多线程面试专题及答案 10....
Android+JAVA【面试题】精编汇总(25份): 2019Android面试 常见58题.docx Android常见原理性面试专题.docx Android面试常问基础知识点.docx BAT Android面试20题详解.docx Java基础面试题.pdf Java;基础知识点面试...
总结整理的Android面试Java基础知识点面试资料精编汇总文档资料合集: Android面试 常见58题.docx Android常见原理性面试专题.docx Android面试常问基础知识点.docx BAT Android面试20题详解.docx Java基础面试题....
收集整理的Android【面试】资料精编汇总(25个) 2019Android面试 常见58题.docx Android常见原理性面试专题.docx Android面试常问基础知识点.docx BAT Android面试20题详解.docx Java基础面试题.pdf Java;基础知识...
Android开发之线程池使用总结 Android学习路线总结,绝对干货 逆流的鱼的博客 汇总优秀的android开发资源 Android学习资源网站索引大全 Android Studiod的配置大全 深入理解Android的startservice和bindservice ...
使用思维导图方式,梳理了多线程整体结构,从多线程的介绍到创建线程、线程的生命周期、线程池、锁种类进行梳理。
丰富的 Java 技术栈:基础和框架,线程池和锁优化,SpringBoot 和分布式消息队列,数据结构和常用算法,设计模式和 JVM 等 易学易会:提供了大量的图片说明和代码示例 你会获得什么 收获 Java 技术栈的核心知识点 这...
JAVA面试秘籍一份通向理想互联网公司的面试汇总,包括Java基础、Java并发、JVM、MySQL、Redis、Spring、MyBatis、Kafka、计算机操作系统、计算机网络、系统设计、分布式、Java项目实战等。Java多线程,包括多线程...
主要介绍了java中ThreadPoolExecutor常识汇总,线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的,需要的朋友可以参考下
二面问题汇总 对象之间的关系 方法重载和重写的区别 线程池有哪些参数 Union和Unionall的区别 redis事务三条命令 redis定时任务 Spring的注解 什么是单例模式 @RequestMapping有什么参数 ConcurrentHashMap怎么实现...