为什么需要线程池?
 
每次都要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. Laravel Eloquent 数据查询结果中日期的格式化

    两种情况: 使用 Model 的查询 例如: $item = App\Models\Apple::first(); $date = $item->created_at->format('Y ...

  2. 在IDEA中实战Git

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程git仓库上获取项目源码 场景三:小 ...

  3. 2017-2018-2 20155309南皓芯《网络对抗技术》Exp2 后门原理与实践

    实验要求 (1)使用netcat获取主机操作Shell,cron启动 (0.5分) (2)使用socat获取主机操作Shell, 任务计划启动 (0.5分) (3)使用MSF meterpreter( ...

  4. MockMvc 对 Spring Boot 进行单元测试

    import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.ann ...

  5. 【UER #1】DZY Loves Graph(待卡常数)

    题解: 正解是可持久化并查集 但这个显然是lct可以维护的 但这常数是个问题啊??? #include <bits/stdc++.h> using namespace std; struc ...

  6. [转]Kindle 推送教程:教你用电子邮箱推送电子书

    Kindle 推送是什么意思?如何通过电子邮件附件推送?或许刚刚接触 Kindle 的朋友对这个概念不是很清楚,其实所谓 Kindle 推送是指亚马逊提供的一个“Kindle 个人文档服务”,我们只需 ...

  7. openstack学习-nove控制节点部署(四)

    nove在openstack非常重要,主要负责创建虚拟机 nova计算服务 API :负责接收和响应外部请求.支持openstack API,EC2 API Cert:负责身份认证EC 2 Sched ...

  8. Spring日记_01 之 Eclipse下的Tomcat服务器配置 以及 Springmvc和Servlet的使用

    安装Tomcat – window – preferences – Server                                                  右键Tomcat v ...

  9. Linux学习之文件特殊权限详解(SetUID、SetGID、Sticky BIT)(十一)

    Linux学习之文件特殊权限详解(SetUID.SetGID.Sticky BIT) 目录 SetUID SetGID Sticky BIT SetUID SetUID简介 只有可以执行的二进制程序和 ...

  10. 动态规划-线性dp-hdu-4055

    https://www.cnblogs.com/31415926535x/p/10423047.html 这道题是大连的某一年的现场赛的题hdu-4055 ,,,刚开始做线性dp的题,,看了好半天才看 ...