【Java并发核心四】Executor 与 ThreadPoolExecutor
Executor 和 ThreadPoolExecutor 实现的是线程池,主要作用是支持高并发的访问处理。
Executor 是一个接口,与线程池有关的大部分类都实现了此接口。
ExecutorService 是 Executor 的子接口;AbstractExecutorService 是 ExecutorService 的实现类,但是是抽象类。
ThreadPoolExecutor 是 AbstractExecutorService 的子类,可实例化。
Executors 是一个工厂类,用于创建线程池。
1、Executors 的 使用:
(1) newCachedThreadPool() 返回 ExecutorService 实例,创建无界限线程池,理论上线程最大个数是 Integer.MAX_VALUE,使用举例:
final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
ExecutorService executorService = Executors.newCachedThreadPool();
// 此线程池运行5个线程
for (int i = 0; i < 5; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("Thread-" + index + "-begin-" + sf.format(new Date()));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread-" + index + "-end-" + sf.format(new Date()));
}
});
}
运行结果:

从上图可以看出,线程在execute 加载后,基本是并发执行的,并非顺序执行。
(2) newFixedThreadPool(int) 返回 ExecutorService 实例,创建的是有界线线程池,即线程个数可以指定最大数量,如果超过最大数量,则后加入的线程需要等待。
还有api:newFixedThreadPool(int , ThreadFactory),newCachedThreadPool( ThreadFactory ) 方法同理。
(3) newSingleThreadExecutor() 创建单一线程池,实现以队列的方式来执行任务。
2、ThreadPoolExecutor 的使用:
Executors 工厂类中,很多地方是调用的 ThreadPoolExecutor 来实现的,单独调用 ThreadPoolExecutor 要考虑的相对要多一些但也更灵活。
【Java并发核心四】Executor 与 ThreadPoolExecutor的更多相关文章
- 【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser
个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢.我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性. 所以,针对java并 ...
- [转]Java并发的四种风味:Thread、Executor、ForkJoin和Actor
这篇文章讨论了Java应用中并行处理的多种方法.从自己管理Java线程,到各种更好几的解决方法,Executor服务.ForkJoin 框架以及计算中的Actor模型. Java并发编程的4种风格:T ...
- java并发编程:Executor、Executors、ExecutorService
1.Executor和ExecutorService Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable comma ...
- Java 并发 —— Thread、Executor、线程池
Java 线程池: ThreadPoolExecutor,创建此线程池的方法: new Executors.newCachedThreadPool():尽量避免使用,其无法控制线程数量, Schedu ...
- 【JAVA并发第四篇】线程安全
1.线程安全 多个线程对同一个共享变量进行读写操作时可能产生不可预见的结果,这就是线程安全问题. 线程安全的核心点就是共享变量,只有在共享变量的情况下才会有线程安全问题.这里说的共享变量,是指多个线程 ...
- 【java并发核心一】Semaphore 的使用思路
最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴的代码都是我运行过的,大家一起学习,欢迎吐槽. 估计也没多少人看我的博客,哈哈,那么我还是会记 ...
- 【Java并发编程四】关卡
一.什么是关卡? 关卡类似于闭锁,它们都能阻塞一组线程,直到某些事件发生. 关卡和闭锁关键的不同在于,所有线程必须同时到达关卡点,才能继续处理.闭锁等待的是事件,关卡等待的是其他线程. 二.Cycli ...
- Java并发(四):happens-before
happens-before 一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系 happen-before原则是JMM中非常重要的原则,它是判断数据是 ...
- Java 并发编程(四):如何保证对象的线程安全性
01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...
随机推荐
- Win10安装TensorFlow1.9-GPU版本
前言 前段时间更新自己电脑上的tf1.4到1.9,没想到踩了这么多坑...特意记录下来希望可以帮到大家 删除旧版本 如果你电脑上没有安装旧版本的tf,就可以忽略这一步.我是因为想要升级到最新版本,所以 ...
- java 多线程和并行程序设计
多线程使得程序中的多个任务可以同时执行 在一个程序中允许同时运行多个任务.在许多程序设计语言中,多线程都是通过调用依赖系统的过程或函数来实现的 为什么需要多线程?多个线程如何在单处理器系统中同时运行? ...
- springboot系列九,springboot整合邮件服务、整合定时任务调度
一.整合邮件服务 如果要进行邮件的整合处理,那么你一定需要有一个邮件服务器,实际上 java 本身提供有一套 JavaMail 组件以实现邮件服务器的搭建,但是这个搭建的服务器意义不大,因为你现在搭建 ...
- Vue+ajax的使用小结
js var vue = new Vue({ el:"#vueid", data:{ selectById : "", }, methods:{ yourMet ...
- discuz安装:mysqli_connect()不支持advice_mysqli_connect
原文:http://blog.csdn.net/changzhi1990/article/details/40983247 php -m 输出: PHP Warning: PHP Startup: U ...
- Maven介绍及安装与配置
一.Maven的作用 在开发中,为了保证编译通过,我们会到处去寻找jar包,当编译通过了,运行的时候,却发现"ClassNotFoundException",我们想到的是,难道还差 ...
- Vue.js+Koa2移动电商实战 笔记
地址:http://jspang.com/ https://github.com/shenghy/SmileVue 1.vant https://www.youzanyun.com/zanui/va ...
- 100以内奇偶数(for循环)
- rownum和分析函数 over
select rownum, t.* from qyuser.tr_apply_info t where rownum < 10; --rownum 对于满足 查询条件的结果,从1 开始,所以大 ...
- laravel 同数据表字段比较查询和状态不正规排序
今天写群组推荐接口,要求未满的群 ( 群最大人数字段maxusers, 群人数字段affiliations_count 都在群组表中),官方,热门(普通群0 ,官方1,热门2 ) 排序的群 同表字段比 ...