本文转载自:http://www.cnblogs.com/starcrm/p/5010863.html

案例1:

  1. package com.net.thread.future;
  2.  
  3. import java.util.concurrent.Callable;
  4. import java.util.concurrent.ExecutionException;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.FutureTask;
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. /**
  11. * @author
  12. * @Time:2017年8月18日 上午10:49:07
  13. * @version 1.0
  14. * @description
  15. */
  16. import java.util.concurrent.ExecutionException;
  17. import java.util.concurrent.ExecutorService;
  18. import java.util.concurrent.Executors;
  19. import java.util.concurrent.FutureTask;
  20. import java.util.concurrent.TimeUnit;
  21. import java.util.concurrent.TimeoutException;
  22.  
  23. public class FutureTaskExample {
  24.  
  25. public static void main(String[] args) {
  26. MyCallable callable1 = new MyCallable(1000);
  27. MyCallable callable2 = new MyCallable(5000);
  28.  
  29. FutureTask<String> futureTask1 = new FutureTask<String>(callable1);
  30. FutureTask<String> futureTask2 = new FutureTask<String>(callable2);
  31.  
  32. ExecutorService executor = Executors.newFixedThreadPool(2);
  33. executor.execute(futureTask1);
  34. executor.execute(futureTask2);
  35.  
  36. while (true)
  37. {
  38. try {
  39. if(futureTask1.isDone() && futureTask2.isDone()){
  40. System.out.println("Done");
  41. //shut down executor service
  42. executor.shutdown();
  43. return;
  44. }
  45.  
  46. if(!futureTask1.isDone()){
  47. //阻塞futureTask1
  48. System.out.println("FutureTask1 output="+futureTask1.get());
  49. }
  50.  
  51. if(!futureTask2.isDone()){
  52. //阻塞futureTask2
  53. System.out.println("FutureTask2 output="+futureTask2.get(1000,TimeUnit.MILLISECONDS));
  54. }
  55.  
  56. } catch (InterruptedException | ExecutionException e) {
  57. e.printStackTrace();
  58. }catch(Exception e){
  59. //do nothing
  60. }
  61. }
  62.  
  63. }
  64.  
  65. static class MyCallable implements Callable<String> {
  66.  
  67. private long waitTime;
  68.  
  69. public MyCallable(int timeInMillis){
  70. this.waitTime=timeInMillis;
  71. }
  72. @Override
  73. public String call() throws Exception {
  74. Thread.sleep(waitTime);
  75. return Thread.currentThread().getName();
  76. }
  77.  
  78. }
  79. }

运行结果很简单,必须是:

FutureTask1 output=pool-1-thread-1
FutureTask2 output=pool-1-thread-2
Done

案例2:

  1. package com.net.thread.future;
  2.  
  3. import java.util.concurrent.Callable;
  4. import java.util.concurrent.ExecutionException;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.FutureTask;
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. /**
  11. * @author
  12. * @Time:2017年8月18日 上午10:49:07
  13. * @version 1.0
  14. * @description
  15. */
  16. public class FutureTaskExample2 {
  17.  
  18. public static void main(String[] args) {
  19. MyCallable callable1 = new MyCallable(1000);
  20. MyCallable callable2 = new MyCallable(5000);
  21.  
  22. FutureTask<String> futureTask1 = new FutureTask<String>(callable1);
  23. FutureTask<String> futureTask2 = new FutureTask<String>(callable2);
  24.  
  25. ExecutorService executor = Executors.newFixedThreadPool(2);
  26. executor.execute(futureTask1);
  27. executor.execute(futureTask2);
  28.  
  29. while (true)
  30. {
  31. try {
  32. if(futureTask1.isDone() && futureTask2.isDone()){
  33. System.out.println("Done");
  34. //shut down executor service
  35. executor.shutdown();
  36. return;
  37. }
  38.  
  39. if(!futureTask1.isDone()){
  40. //阻塞futureTask1
  41. System.out.println("FutureTask1 output="+futureTask1.get());
  42. }
  43.  
  44. System.out.println("Waiting for FutureTask2 to complete");
  45. String s = futureTask2.get(1000, TimeUnit.MILLISECONDS); //阻塞500毫秒
  46. if(s !=null){
  47. System.out.println("FutureTask2 output="+s);
  48. }
  49. else{
  50. System.out.println("FutureTask2 output is null");
  51. }
  52. } catch (InterruptedException | ExecutionException e) {
  53. e.printStackTrace();
  54. }catch(Exception e){
  55. //do nothing
  56. }
  57. }
  58. }
  59.  
  60. static class MyCallable implements Callable<String> {
  61.  
  62. private long waitTime;
  63.  
  64. public MyCallable(int timeInMillis){
  65. this.waitTime=timeInMillis;
  66. }
  67. @Override
  68. public String call() throws Exception {
  69. Thread.sleep(waitTime);
  70. return Thread.currentThread().getName();
  71. }
  72.  
  73. }
  74.  
  75. }

运行结果:

FutureTask1 output=pool-1-thread-1
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
Waiting for FutureTask2 to complete
FutureTask2 output=pool-1-thread-2
Done

说明:

1、get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

2、get(long timeout, TimeUnit unit)用来获取执行结果,如果超过指定时间,直接结束执行下面的代码;如果是在循环中,则跳出本次循环进行下一次轮训(continue功能类似)。

【转载】Callable、FutureTask中阻塞超时返回的坑点的更多相关文章

  1. (原创)Callable、FutureTask中阻塞超时返回的坑点

    直接上代码 import java.util.concurrent.Callable; public class MyCallable implements Callable<String> ...

  2. java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程

    用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. ...

  3. 并发编程-Future+callable+FutureTask 闭锁机制

    项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable实现. FutureTask ...

  4. 【转载】Innodb中的事务隔离级别和锁的关系

    前言 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所 ...

  5. ExecutorService、Callable、Future实现有返回结果的多线程原理解析

    原创/朱季谦 在并发多线程场景下,存在需要获取各线程的异步执行结果,这时,就可以通过ExecutorService线程池结合Callable.Future来实现. 我们先来写一个简单的例子-- pub ...

  6. (转载)JavaScript中的Window窗口对象

    (转载)http://www.ijavascript.cn/jiaocheng/javascript-window-65.html 例子: <html> <head> < ...

  7. 【转载】MongoDB中的MapReduce 高级操作介绍

    转载自残缺的孤独 1.概述 MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,va ...

  8. [译]async/await中阻塞死锁

    这篇博文主要是讲解在async/await中使用阻塞式代码导致死锁的问题,以及如何避免出现这种死锁.内容主要是从作者Stephen Cleary的两篇博文中翻译过来. 原文1:Don'tBlock o ...

  9. 【转载】C#中自定义Sort的排序规则IComparable接口

    C#中的List集合在排序的时候,如果不使用Lambda表达式进行排序的话,一般调用Sort()方法进行排序,如果希望Sort()方法排序后的结果跟我们预想的效果一致或者按照我们自定义的规则排序,则需 ...

随机推荐

  1. 日期API

    Java 8 在包java.time下包含了一组全新的时间日期API.下面的例子展示了这组新API里最重要的一些部分: 1.Clock 时钟 Clock类提供了访问当前日期和时间的方法,Clock是时 ...

  2. [Cuckoo SandBox]注入原理篇

    1.LoadExe 接python版本 通过调用LoadExe去加载Dll进行注入 所以先看LoadExe 加载器的功能吧 通过python管道接收到  processID,ThreadID,路径 , ...

  3. java控制某个字段当天递增

    ①思路 1.获取当前时间年月日 如:2018-01-15 00:00:00 2018-01-15 24:00:00 2.查询表中对应日期字段是否在当天时间段内 3.若是在,则从0开始递增 4.若是不在 ...

  4. node安装express时找不到pakage.json文件;判断安装成功?

    正常安装命令:express install express --save 报错如下:no such file or directory,open 'C:\Users\Administrator\pa ...

  5. python if else while for

    1 getpass模块 设置密码不显示明文 用户名和密码输入程序: import getpass username = input("username:") password = ...

  6. ssh-agent && ssh-agent forward && SSH ProxyCommand

    http://blog.csdn.net/sdcxyz/article/details/41487897 https://developer.github.com/guides/using-ssh-a ...

  7. class类重定义

    C++项目中如果一个头文件被多个文件包含,#include"xxx.h",将可能导致头文件里面定义的类被多次编译,解决方法是加编译指示: #pragma once //告诉编译器只 ...

  8. ELF文件格式与进程地址空间的联系

    http://blog.csdn.net/q_l_s/article/details/52597330 三.分析在fork产生新进程中ELF文件格式与进程地址空间的联系 1.进程的虚拟地址空间 每个程 ...

  9. linux客户端传输文件到Windows本地

    1.rz/sz安装及使用方法 和 FileZilla 功能类似用于上传文件,上传速度比较慢适用比较小的文件  yum安装: $ sudo yum install lrzsz   打开SecureCRT ...

  10. 2017.11.13 在C语言中是否能用函数实现模块化程序设计

    第七章 用函数实现模块化程序设计 (1)为什么要用函数? @function既是函数也是功能.函数就是用来完成一定功能的的(函数就是功能),函数名就是给这个功能起一个名字,一个C程序可由一个主函数和若 ...