为什么需要线程池?
 
每次都要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. jquery----data使用

    - .data() - .data("key", value) 保存值,value可以是字符串,也可以是数组,也可以是jquery对象- .data("key" ...

  2. Jquery----对文档操作

    jquery对css操作: 1.CSS .css() - .css("color") -> 获取color css值 - .css("color", &q ...

  3. cf787c 博弈论+记忆化搜索

    好题,单纯的就是pn状态的推导 /* 把第一个点标为0,剩下的点按1-n-1编号 胜态是1,败态为0,dp[i][j]表示第i个人,怪兽起始位置在j时的胜负态 把0点设置为必败态,然后对于一个人来说, ...

  4. JavaScript错误:Maximum call stack size exceeded错误

    错误的表面意思是,因为递归次数太多而内存溢出, 当然引起溢出的原因很多 找了下问题来源,发现引用了两个版本的jquery,在layout.cshtml母模块页中和视图中都引用了jq.导致循环调用,从而 ...

  5. oracle分区表彻底删除的办法,处理删不掉的不规则表名

    Oracle分区表彻底删除的办法当对一个不再使用的分区表进行drop后,查询user_tab_partitions视图发现出现如下不规则的分区表表名:SQL> select distinct t ...

  6. 【Java】 剑指offer(4) 替换空格

    本文参考自<剑指offer>一书,代码采用Java语言.  更多:<剑指Offer>Java实现合集 题目 请实现一个函数,把字符串中的每个空格替换成"%20&quo ...

  7. TotoriseGit安装

    1.前提 前提是有安装过git. 2.下载 3.安装 二:参考的文档 1.不错的文档 https://www.cnblogs.com/xinlj/p/5978730.html http://blog. ...

  8. Qt学习之信号与槽(一)

    Qt学习之信号与槽(一) 目录 QT的信号与槽机制 在窗口的UI设计中操作添加信号和槽     QT的信号与槽机制   QT的两种机制 在Qt和PyQt中有两种通信机制: 低级事件处理机制(low-l ...

  9. HTTP协议学习笔记(三)

    HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...

  10. 学习go语言一篇就够了(持续更新)

    前言:写博客也写了差不多一年了,我更多的时候是记录自己学习的情况,有时也有自己工作上遇到的bug,自己有时候也比较迷茫,不知道怎么去写博文,我也很想别人跟我提提建议,但是有时候觉得写写博客还是很有成就 ...