为什么需要线程池?
每次都要new一个thread,开销大,性能差;不能统一管理;功能少(没有定时执行、中断等)。
使用线程池的好处是,可重用,可管理。

Executor
4种线程池
// 可缓存线程池,如果缓存中没有可用的,则移出60秒未使用过的线程
ExecutorService service= Executors.newCachedThreadPool();
 
// 大小固定的线程池
ExecutorService service= Executors.newFixedThreadPool(5);
// 单线程,是线程量=1的FixedThreadPool,多任务下相当于排队。
ExecutorService service= Executors.newSingleThreadPool();
// 支持定时和周期,一般情况下可替代timer
ScheduledExecutorService exec = Executors.newScheduledThreadPool(int corePoolSize)
Demo
ExecutorService pool= Executors.newCachedThredPool();
pool.ececute(new Runable());
// 关闭,不再接受新的任务请求
pool.shutdown();
// 立即关闭,停止接受task,
pool.showdownNow();
Future
.submit(Runnable) 返回一个Future,主要目的是检查任务执行的状况(是否完成,有无异常)。
interface Future<V>
{
V get() throws ...;
V get(long timeout,TimeUnit unit) throws ..;
void cancel(boolean mayInterrupt); // 取消任务,如果已经开始,mayInterrupt=true时被中断
boolean isCancelled();
boolean isDown();
}
Future task = pool.submit(new Runnable());
task.isDone(); // 
task.get(); // 阻塞当前线程,如果task在执行过程中有异常,则会在这里重新抛出
Callable
Runnable没有返回值,Callable<E>有返回值;
submit一个runnable,不能知道运行结果,可以submit一个callable。
// 创建callable
class MyCallable implements Callable<Integer>
{
@Override
public Integer call()
{
return 1;
}
}
Future<Integer> task = pool.submit(new MyCallable());
task.get(); // 阻塞,显示结果
FutureTask
同时包装了Future和Task。
Callable<Integer> c = ...;
FutureTask<Integer> t = new FutureTask<Integer>(c);
new Thread(task).start();
Integer r = t.get();
CompletionService
completionService = new ExecutorCompletionService<Long>(exec);
for(){
completionService.submit(new Callable());
}
// 取完成的任务,如果没有,就阻塞等待
completionService.take().get()

转载于:https://www.cnblogs.com/caca/p/java_executors.html

Java线程池 / Executor / Callable / Future相关推荐

  1. Java线程池Executor框架

    一.为什么要引入线程池 当存在大量并发任务时,创建.销毁线程需要很大的开销,运用线程池可以大大减小开销. 二.Executor框架 说明: Executor 执行器接口,该接口定义执行Runnable ...

  2. Java线程池(Executor)详解和用法

    背景 面试的时候经常会被三连问.用过吗?如何用的?场景是什么?所以有必要好好的研究下线程池迫在眉睫. 1.讲解之前先了解下 retry: 因为源码中有这个retry标记 先看一个简单的例子 /*** ...

  3. java 队列线程池_Java线程池Executor使用

    原标题:Java线程池Executor使用 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:减少系统对于,外部 服务的响应时间的等待.第 ...

  4. 深入Java线程池:从设计思想到源码解读

    点击关注公众号,实用技术文章及时了解 初识线程池 我们知道,线程的创建和销毁都需要映射到操作系统,因此其代价是比较高昂的.出于避免频繁创建.销毁线程以及方便线程管理的需要,线程池应运而生. 线程池优势 ...

  5. Java并发编程之线程池中的Future

    线程池中的Future: 线程池的典型使用场景 ExecutorService executorService = Executors.newFixedThreadPool(10);//此处Task为 ...

  6. java线程池拒绝策略_Java核心知识 多线程并发 线程池原理(二十三)

    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行.他 ...

  7. java 线程池ThreadPoolExecutor

    线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数 ...

  8. Java 线程池详解

    构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段. 基础知识 Execu ...

  9. Java 线程池(ThreadPoolExecutor)原理分析与使用

    ThreadPoolExecutor原理概述 在我们的开发中"池"的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 使 ...

最新文章

  1. yii mysql 事务处理_Yii2中事务的使用实例代码详解
  2. 《Swift 权威指南》——第6章,第6.7节常量和变量参数
  3. UOJ #282 糖果
  4. Spring MVC 向前台页面传值-ModelAndView
  5. 仅仅有人物没背景的图片怎么弄_五分钟写作课 人物篇 人物的出场是个关键时刻...
  6. MyBatisPlus(笔记)
  7. c++ stl队列初始化_创建一个向量,并将其像C ++ STL中的数组一样初始化
  8. r语言 rep(c(1,R语言(一)
  9. mysql数据库数字类型_Mysql 数据库数值类型详解
  10. webpack——文件和图片打包
  11. 14. Nginx 服务器架构
  12. android之自定义弹框
  13. 公众号运营实用小工具推荐
  14. 计算机的外面板接口,(电脑各种接口规范.doc
  15. HTML函数多个条件并列,excel if函数如何多个条件并列
  16. 中级宏观经济学复习范围(马工程)
  17. “二向箔”其实并不存在丨《三体》里的数学问题
  18. 计算机工具属性不见了怎么办,电脑文件夹选项不见了,详细教您解决电脑文件夹选项不见了...
  19. org.hibernate.UnknownEntityTypeException: Unable to locate persister: com.mm.constract.domain.Contra
  20. 推荐一款USB维护系统:杏雨梨云USB维护系统

热门文章

  1. Go Micro搭建简单微服务
  2. 前端开发之模块化初探
  3. warning:This application is modifying the autolayout engine from a background thread
  4. 防止NSTimer和调用对象之间的循环引用
  5. 实现库函数strlen和strcpy
  6. 春招平均薪酬最高的职业TOP10
  7. 4段简短代码教你用Python读写Excel
  8. 小学生们在B站讲算法,这么内卷么?
  9. 简单的Postman,还能玩出花?
  10. 你也被Spring的这个“线程池”坑过吗?