【转载】Callable、FutureTask中阻塞超时返回的坑点
本文转载自: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中阻塞超时返回的坑点相关推荐
- 转载|网络编程中阻塞式函数的底层逻辑
逛知乎看到的,觉得写的挺透彻的,转载一下,原文链接:Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗? 原文以阻塞式的recv函数作为讲解,但是所有阻塞式的api底层逻辑基本相通. ...
- JAVA中阻塞队列的类别和区别(转载)
这篇文章将介绍什么是阻塞队列,以及Java中阻塞队列的4种处理方式,并介绍Java 7中提供的7种阻塞队列,最后分析阻塞队列的一种实现方式. 阻塞队列(BlockingQueue)是一个支持两个附加操 ...
- FutureTask中Treiber堆的实现
2019独角兽企业重金招聘Python工程师标准>>> 在文章FutureTask源码分析中简单说明了FutureTask中使用Treiber堆栈来保存等待结果的线程,本文将详细分析 ...
- 【转】2.2[译]async/await中阻塞死锁
这篇博文主要是讲解在async/await中使用阻塞式代码导致死锁的问题,以及如何避免出现这种死锁.内容主要是从作者Stephen Cleary的两篇博文中翻译过来. 原文1:Don'tBlock o ...
- Java中阻塞队列类型介绍
Java中的几种阻塞队列 Java中的BlockingQueue接口是一个线程安全的存取队列,适用于生产者消费者的应用场景中,支持两个附加操作: 生产者线程会一直不断的往阻塞队列中放入数据,直到队列满 ...
- ffmpeg中av_read_frame 超时设置
https://trac.ffmpeg.org/ ffmpeg wiki ffmpeg中avformat_open_input超时设置 这里有日志可以参考:日志 y也可以参考: https://blo ...
- KafkaConsumer 长时间地在poll(long )方法中阻塞
一,问题描述 搭建的用来测试的单节点Kafka集群(Zookeeper和Kafka Broker都在同一台Ubuntu上),在命令行下使用: ./bin/kafka-topics.sh --creat ...
- Oracle中过程/函数返回结果集
http://www.cnitblog.com/wufajiaru/archive/2009/04/28/56796.html Oracle 存储过程返回结果集 关键字: 转载 Sql代码 Oracl ...
- java futuretask 实例_java 使用Callable+FutureTask获取执行结果
之前给大家分享了使用Callable+Future获取执行结果的java示例,那么下面要给大家分享的就是使用Callable+FutureTask获取执行结果的java示例,一起来看看吧.public ...
最新文章
- 三菱je-a系列伺服支持modbusrtu 协议吗_入门课程 | 三菱FX系列PLC的软元件介绍
- R语言使用ggplot2包的快速可视化函数qplot绘制分组直方图(分组颜色设置)实战
- 彻底理解C#中值类型和引用类型的区别
- 原型继承与属性拷贝的混合应用
- 关于C++指针的理解
- DL之GANDCGNNcGAN:GANDCGNNcGAN算法思路、关键步骤的相关配图和论文集合
- Html 教程 (5) “表格”三要素
- 终于感觉掌握了一门重要的技术
- loadrunner脚本练习
- 系统输入输入出设计相关知识介绍
- asp.net中, 如何在后台获取访问这个页面的用户的名字?
- mysql8 create table 语法错误_MySQL8.0 Window Function 剖析
- jdbc 4.0连接mysql_使用JDBC连接操作数据库
- pandas聚合group函数
- 仙剑奇侠传脚本制作教程
- 纯C语言实战-打字游戏
- 学校学业水平测试软件,中小学生学业水平测试
- 大数据就业:学完大数据怎样就业
- 抛砖引玉,孢子,一种另类的WP7第三方应用数据交换方式
- 看完不会的来打我!Mycat和Mysql搭建高可用企业数据库集群
热门文章
- spring boot使用外置tomcat部署需要排除的依赖
- Java客户端操作zookeeper:获取及修改节点中的数据内容代码示例
- springAOP编程-aspectJ开启注解自动代理
- spring入门-设值方法的差异
- bentley 二次开发_Bentley的基本概念
- 嵌入式开发中对(*(volatile unsigned long *)) 的理解
- ROS中catkin_make编译输出的可执行文件在哪?
- python 柱状图 居中_python matplotlib模块: bar(柱状图)
- Four-tuples (2018山东省省赛 容斥定理)
- python字符集_Python任意字符集转换