为什么需要线程池?
 
每次都要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()
 

Java线程池 / Executor / Callable / Future的更多相关文章

  1. Java线程池(Callable+Future模式)

    转: Java线程池(Callable+Future模式) Java线程池(Callable+Future模式) Java通过Executors提供四种线程池 1)newCachedThreadPoo ...

  2. Java线程池 Executor框架概述

    线程池的意义 循环利用线程资源,避免重复创建和销毁线程 线程池的任务是异步执行的,只要提交完成就能快速返回,可以提高应用响应性 Java线程池还有一个很重要的意义:Java线程池就是JDK 5 推出的 ...

  3. JAVA 线程池之Callable返回结果

    本文介绍如何向线程池提交任务,并获得任务的执行结果.然后模拟 线程池中的线程在执行任务的过程中抛出异常时,该如何处理. 一,执行具体任务的线程类 要想 获得 线程的执行结果,需实现Callable接口 ...

  4. Java 线程池 Executor 框架

    在Java中,可以通过new Thread 的方法来创建一个新的线程执行任务,但是线程的创建是非常耗时的,而且创建出来的新的线程都各自运行.缺乏统一的管理,这样的后果是可能导致创建过多的线程从而过度消 ...

  5. Java线程池Executor&ThreadPool

    java自1.5版本之后,提供线程池,供开发人员快捷方便的创建自己的多线程任务.下面简单的线程池的方法及说明. 1.Executor 线程池的顶级接口.定义了方法execute(Runnable),该 ...

  6. (转)深入详解Java线程池——Executor框架

    转:https://yq.aliyun.com/articles/633782?utm_content=m_1000015330 在Java中,使用线程来异步执行任务.Java线程的创建与销毁需要一定 ...

  7. (Java 多线程系列)Java 线程池(Executor)

    线程池简介 线程池是指管理同一组同构工作线程的资源池,线程池是与工作队列(Work Queue)密切相关的,其中在工作队列中保存了所有等待执行的任务.工作线程(Worker Thread)的任务很简单 ...

  8. Java线程池Executor使用

    合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:减少系统对于,外部 服务的响应时间的等待.第三:提高线程的可管理性.线程是稀缺资源,如果 ...

  9. Java并发——线程池Executor框架

    线程池 无限制的创建线程 若采用"为每个任务分配一个线程"的方式会存在一些缺陷,尤其是当需要创建大量线程时: 线程生命周期的开销非常高 资源消耗 稳定性 引入线程池 任务是一组逻辑 ...

随机推荐

  1. cf792b循环链表

    头尾链接一下就好, /* 1 2 3 4 5 6 7:4 5 6 7 1 2 3:2 3 5 6 7 1:5 6 7 1 3:6 7 1 3:1 3 7 */ #include<bits/std ...

  2. docker安装sonarqube及实际应用

    由于平台的多样化,在不同环境的安装方式可能也不一样,为了避免环境不一致带来的差异,特记一笔容器安装: 一.Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题. 1. ...

  3. python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)

    class Decorator(): def __init__(self, f): print('run in init......') self.f = f def __call__(self, a ...

  4. BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...

  5. Redis数据结构之set

    一:介绍 1.set结构 没有顺序 并且,不允许出现重复的元素. 二:Redis客户端的常用命令 1.添加 2.查看数据 3.删除数据 4.是否存在某个值 1代表有,0代表无. 5.查看差值 有key ...

  6. java技术第二次作业

    (一)学习总结 1.什么是构造方法?什么是构造方法的重载? 构造方法是用于对对象初始化的方法,当新对象被创建的时候,构造函数会被调用. 每一个类都有构造函数.在程序员没有给类提供构造函数的情况下,Ja ...

  7. codeforces 366C Dima and Salad 【限制性01背包】

    <题目链接> 题目大意: 在一个水果篮里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出来一些做一个水果沙拉, 并且要求他的水果沙拉的美味度是卡路里 ...

  8. Python爬虫之Beautiful Soup解析库的使用(五)

    Python爬虫之Beautiful Soup解析库的使用 Beautiful Soup-介绍 Python第三方库,用于从HTML或XML中提取数据官方:http://www.crummv.com/ ...

  9. Playmaker全面实践教程之Playmaker常用工具

    Playmaker全面实践教程之Playmaker常用工具 Playmaker常用工具 Playmaker插件搭载了8个工具:FSM Browser.State Browser.Templates.T ...

  10. grpc 使用流程、使用技巧

    1.通过maven插件编译出java stub类. 2.对于批量调用的场景,我们可以使用FutureStub,对于普通的业务类型RPC,我们应该使用BlockingStub. 3.创建批量生成多个语言 ...