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

案例1:

package com.net.thread.future;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;/*** @author * @Time:2017年8月18日 上午10:49:07* @version 1.0* @description*/ import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask;import java.util.concurrent.TimeUnit;import java.util.concurrent.TimeoutException;public class FutureTaskExample {public static void main(String[] args) {MyCallable callable1 = new MyCallable(1000);MyCallable callable2 = new MyCallable(5000);FutureTask<String> futureTask1 = new FutureTask<String>(callable1);FutureTask<String> futureTask2 = new FutureTask<String>(callable2);ExecutorService executor = Executors.newFixedThreadPool(2);executor.execute(futureTask1);executor.execute(futureTask2);while (true) {try {if(futureTask1.isDone() && futureTask2.isDone()){System.out.println("Done");//shut down executor service
                     executor.shutdown();return;}if(!futureTask1.isDone()){//阻塞futureTask1System.out.println("FutureTask1 output="+futureTask1.get());}if(!futureTask2.isDone()){//阻塞futureTask2System.out.println("FutureTask2 output="+futureTask2.get(1000,TimeUnit.MILLISECONDS));}} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}catch(Exception e){//do nothing
             }}}static class MyCallable implements Callable<String> {private long waitTime;public MyCallable(int timeInMillis){this.waitTime=timeInMillis;}@Overridepublic String call() throws Exception {Thread.sleep(waitTime);return Thread.currentThread().getName();}}}

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

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

案例2:

package com.net.thread.future;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;/*** @author * @Time:2017年8月18日 上午10:49:07* @version 1.0* @description*/
public class FutureTaskExample2 {public static void main(String[] args) {MyCallable callable1 = new MyCallable(1000);MyCallable callable2 = new MyCallable(5000);FutureTask<String> futureTask1 = new FutureTask<String>(callable1);FutureTask<String> futureTask2 = new FutureTask<String>(callable2);ExecutorService executor = Executors.newFixedThreadPool(2);executor.execute(futureTask1);executor.execute(futureTask2);while (true) {try {if(futureTask1.isDone() && futureTask2.isDone()){System.out.println("Done");//shut down executor service
                     executor.shutdown();return;}if(!futureTask1.isDone()){//阻塞futureTask1System.out.println("FutureTask1 output="+futureTask1.get());}System.out.println("Waiting for FutureTask2 to complete");String s = futureTask2.get(1000, TimeUnit.MILLISECONDS); //阻塞500毫秒if(s !=null){System.out.println("FutureTask2 output="+s);}else{System.out.println("FutureTask2 output is null");}} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}catch(Exception e){//do nothing
             }  }}static class MyCallable implements Callable<String> {private long waitTime;public MyCallable(int timeInMillis){this.waitTime=timeInMillis;}@Overridepublic String call() throws Exception {Thread.sleep(waitTime);return Thread.currentThread().getName();}}}

运行结果:

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功能类似)。

转载于:https://www.cnblogs.com/chen1-kerr/p/7388725.html

【转载】Callable、FutureTask中阻塞超时返回的坑点相关推荐

  1. 转载|网络编程中阻塞式函数的底层逻辑

    逛知乎看到的,觉得写的挺透彻的,转载一下,原文链接:Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗? 原文以阻塞式的recv函数作为讲解,但是所有阻塞式的api底层逻辑基本相通. ...

  2. JAVA中阻塞队列的类别和区别(转载)

    这篇文章将介绍什么是阻塞队列,以及Java中阻塞队列的4种处理方式,并介绍Java 7中提供的7种阻塞队列,最后分析阻塞队列的一种实现方式. 阻塞队列(BlockingQueue)是一个支持两个附加操 ...

  3. FutureTask中Treiber堆的实现

    2019独角兽企业重金招聘Python工程师标准>>> 在文章FutureTask源码分析中简单说明了FutureTask中使用Treiber堆栈来保存等待结果的线程,本文将详细分析 ...

  4. 【转】2.2[译]async/await中阻塞死锁

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

  5. Java中阻塞队列类型介绍

    Java中的几种阻塞队列 Java中的BlockingQueue接口是一个线程安全的存取队列,适用于生产者消费者的应用场景中,支持两个附加操作: 生产者线程会一直不断的往阻塞队列中放入数据,直到队列满 ...

  6. ffmpeg中av_read_frame 超时设置

    https://trac.ffmpeg.org/ ffmpeg wiki ffmpeg中avformat_open_input超时设置 这里有日志可以参考:日志 y也可以参考: https://blo ...

  7. KafkaConsumer 长时间地在poll(long )方法中阻塞

    一,问题描述 搭建的用来测试的单节点Kafka集群(Zookeeper和Kafka Broker都在同一台Ubuntu上),在命令行下使用: ./bin/kafka-topics.sh --creat ...

  8. Oracle中过程/函数返回结果集

    http://www.cnitblog.com/wufajiaru/archive/2009/04/28/56796.html Oracle 存储过程返回结果集 关键字: 转载 Sql代码 Oracl ...

  9. java futuretask 实例_java 使用Callable+FutureTask获取执行结果

    之前给大家分享了使用Callable+Future获取执行结果的java示例,那么下面要给大家分享的就是使用Callable+FutureTask获取执行结果的java示例,一起来看看吧.public ...

最新文章

  1. 三菱je-a系列伺服支持modbusrtu 协议吗_入门课程 | 三菱FX系列PLC的软元件介绍
  2. R语言使用ggplot2包的快速可视化函数qplot绘制分组直方图(分组颜色设置)实战
  3. 彻底理解C#中值类型和引用类型的区别
  4. 原型继承与属性拷贝的混合应用
  5. 关于C++指针的理解
  6. DL之GANDCGNNcGAN:GANDCGNNcGAN算法思路、关键步骤的相关配图和论文集合
  7. Html 教程 (5) “表格”三要素
  8. 终于感觉掌握了一门重要的技术
  9. loadrunner脚本练习
  10. 系统输入输入出设计相关知识介绍
  11. asp.net中, 如何在后台获取访问这个页面的用户的名字?
  12. mysql8 create table 语法错误_MySQL8.0 Window Function 剖析
  13. jdbc 4.0连接mysql_使用JDBC连接操作数据库
  14. pandas聚合group函数
  15. 仙剑奇侠传脚本制作教程
  16. 纯C语言实战-打字游戏
  17. 学校学业水平测试软件,中小学生学业水平测试
  18. 大数据就业:学完大数据怎样就业
  19. 抛砖引玉,孢子,一种另类的WP7第三方应用数据交换方式
  20. 看完不会的来打我!Mycat和Mysql搭建高可用企业数据库集群

热门文章

  1. spring boot使用外置tomcat部署需要排除的依赖
  2. Java客户端操作zookeeper:获取及修改节点中的数据内容代码示例
  3. springAOP编程-aspectJ开启注解自动代理
  4. spring入门-设值方法的差异
  5. bentley 二次开发_Bentley的基本概念
  6. 嵌入式开发中对(*(volatile unsigned long *)) 的理解
  7. ROS中catkin_make编译输出的可执行文件在哪?
  8. python 柱状图 居中_python matplotlib模块: bar(柱状图)
  9. Four-tuples (2018山东省省赛 容斥定理)
  10. python字符集_Python任意字符集转换