1. import java.util.Random;
  2. import java.util.concurrent.Callable;
  3. import java.util.concurrent.CompletionService;
  4. import java.util.concurrent.ExecutorCompletionService;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.Future;
  8.  
  9. /**
  10. * Callable Future completionService test
  11. *
  12. * Future取得结果类型和Callable返回的结果
  13. *
  14. * Callable需要ExecutorService使用submit方式提交
  15. *
  16. * CompletionService 用于提交一组Callable,其中take方法返回已经完成的Callable任务
  17. *
  18. * @author duwenlei
  19. *
  20. */
  21. public class CallableFutureTest {
  22.  
  23. private static void testCallable() throws Exception {
  24. ExecutorService service = Executors.newSingleThreadExecutor();
  25. Future<String> future = service.submit(new Callable<String>() {
  26. @Override
  27. public String call() throws Exception {
  28. Thread.sleep(5000); //停止5秒返回
  29. return "hello";
  30. }
  31. });
  32. System.out.println("等待结果");
  33. System.out.println("取得结果:"+future.get());
  34. //System.out.println("取得结果:"+future.get(1, TimeUnit.SECONDS));
  35. service.shutdown();
  36. }
  37.  
  38. private static void testCompletionService() throws Exception{
  39. ExecutorService executor = Executors.newFixedThreadPool(3);
  40. CompletionService<Integer> service = new ExecutorCompletionService<Integer>(executor); //需要一个线程池
  41. for (int i = 1; i <= 10; i++) {
  42. final int seq = i;
  43. service.submit(new Callable<Integer>() {
  44. @Override
  45. public Integer call() throws Exception {
  46. Thread.sleep(new Random().nextInt(5000)); //休息时间,不确定
  47. return seq;
  48. }
  49. });
  50. }
  51. for (int i = 1; i <= 10; i++) {
  52. System.out.println(service.take().get());
  53. }
  54. executor.shutdown();
  55. }
  56.  
  57. public static void main(String[] args) {
  58. try {
  59. testCallable();
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. }
  63. try {
  64. testCompletionService();
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }
  68. }
  69.  
  70. }

JAVA线程池中的Callable和Future的更多相关文章

  1. Java多线程系列--“JUC线程池”06之 Callable和Future

    概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...

  2. Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...

  3. Java线程池中的核心线程是如何被重复利用的?

    真的!讲得太清楚了!https://blog.csdn.net/MingHuang2017/article/details/79571529 真的是解惑了 本文所说的"核心线程". ...

  4. Java线程池中线程的状态简介

    首先明确一下线程在JVM中的各个状态(JavaCore文件中) 1.死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on condition ...

  5. Java线程池中submit()和execute()方法有什么区别

    两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,而submit()方法返回有计算结构的Future对象,它定义在ExecutorServic ...

  6. Java线程池中submit() 和 execute()方法的区别

    两个方法都可以向线程池提交任务, execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorS ...

  7. Java线程池中线程的生命周期

    设:我们有一个coreSize=10,maxSize=20,keepAliveTime=60s,queue=40 1.池初始化时里面没有任何线程. 2.当有一个任务提交到池就创建第一个线程. 3.若继 ...

  8. Java 线程池中 submit() 和 execute()方法有什么区别?

    两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在 Executor 接口中. 而 submit()方法可以返回持有计算结果的 Future 对象,它定义在 Exe ...

  9. Java线程池中submit()和execute之间的区别?

    一: submit()方法,可以提供Future < T > 类型的返回值. executor()方法,无返回值. execute无返回值 public void execute(Runn ...

随机推荐

  1. jquery 取消绑定事件

    $(".TreeView1_0").unbind("mouseover"); $("#id").attr("onclick&quo ...

  2. php使用 memcache 来存储 session 方法总结

    设置session用memcache来存储 方法I: 在 php.ini 中全局设置 session.save_handler = memcache session.save_path = " ...

  3. VMware workstation CentOs 7 虚拟机网卡设置为NAT模式并设置固定IP

    一.背景知识      虚拟机网络模式 无论是vmware workstation,virtual box,virtual pc等虚拟机软件,一般来说,虚拟机有三种网络模式: 1.桥接 2.NAT 3 ...

  4. .dmp文件导入个别表

    imp bizinfo_qy/bizinfo_qy@orcl161 file=D:\收付费核算系统\分线\bizinfo_qy.dmp log=bizinfo_qy.log  TABLES=(al_i ...

  5. ios数据库SQLite实现

    SQLite嵌入式数据库 1.支持时间,不需要配置,不需要安装,不需要管理员; 2.支持大部分SQL92; 3.完整的数据库保存在磁盘上面的一个文件,同一个数据库文件可以在不同机器上面使用.最大支持数 ...

  6. angularJs非空校验requied

    <!DOCTYPE html><html><head><meta charset="utf-8"><title>< ...

  7. DHCP中继

    DHCP中继 要求: 假设公司现在有两个部门分别为 销售部门,生产部门 对这两个部门分配不同网段, 销售部门 192.168.1.0/24 生产部门 192.168.2.0/24 为了节约使用LINU ...

  8. 网页内嵌入QQ通信组件,唤起QQ,针对不同平台的处理方式

    web浏览器中嵌入QQ通信组件,目前发现有两种方式,主要是区分 IOS平台(苹果系列)和其他平台(PC 安卓等……),下面是代码区别: <li><a href="http: ...

  9. react 评论列表插入评论数据 unshift

    // unshift 新增数据放到最上面 //插入 回复/发表 评论else if(action.type === INSERT_COMMENT ){ let content = action.tex ...

  10. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...