Java Callable Future接口可用来获得线程的并发处理优势,以及它们能够为调用程序返回值。

FutureTask是Future接口的基本具体实现,并提供异步处理。它包含启动和取消任务的方法,以及可以返回FutureTask状态的方法,无论它是完成还是取消。需要一个可调用的对象来创建未来的任务,然后我们可以使用Java线程池执行器来异步处理它们。

下面来看一下使用简单的FutureTask示例程序。

由于FutureTask需要一个可调用的对象,将创建一个简单的Callable实现。

import java.util.concurrent.Callable;

public class MyCallable implements Callable {

private long waitTime;

public MyCallable(int timeInMillis){

this.waitTime=timeInMillis;

}

@Override

public String call() throws Exception {

Thread.sleep(waitTime);

//return the thread name executing this callable task

return Thread.currentThread().getName();

}

}

下面是FutureTask方法的一个示例,它显示了FutureTask的常用方法。

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(2000);

FutureTask futureTask1 = new FutureTask(callable1);

FutureTask futureTask2 = new FutureTask(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()){

//wait indefinitely for future task to complete

System.out.println("FutureTask1 output="+futureTask1.get());

}

System.out.println("Waiting for FutureTask2 to complete");

String s = futureTask2.get(200L, TimeUnit.MILLISECONDS);

if(s !=null){

System.out.println("FutureTask2 output="+s);

}

} catch (InterruptedException | ExecutionException e) {

e.printStackTrace();

}catch(TimeoutException e){

//do nothing

}

}

}

}

当运行上面的程序时,它不会打印任何东西,因为FutureTask的get()方法等待任务完成然后返回输出对象。还有一个重载方法也只等待指定的时间,我们将它用于futureTask2。还要注意使用isDone()方法确保程序在执行完所有任务后终止。

上述程序的输出将是:

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

Waiting for FutureTask2 to complete

FutureTask2 output=pool-1-thread-2

Done

因此,FutureTask没有任何好处,但是当我们想要覆盖一些Future接口方法并且不想实现Future接口的每个方法时,它会派上用场。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

java futuretask_Java FutureTask示例相关推荐

  1. Java FutureTask示例程序

    有时我写了一篇有关Java Callable Future接口的文章,我们可以使用它来获得线程的并发处理优势,以及它们能够将值返回给调用程序. FutureTask是Future接口的基础具体实现,并 ...

  2. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  3. java web程序示例_想要建立一些有趣的东西吗? 这是示例Web应用程序创意的列表。...

    java web程序示例 Interested in learning JavaScript? Get my ebook at jshandbook.com 有兴趣学习JavaScript吗? 在js ...

  4. Java版世界时钟示例

    Java版世界时钟示例 这是一个Java版的世界时钟示例,移植自Gerrit创建的同名Swing应用(http://www.jug-muenster.de/swing-worldclock-427 ) ...

  5. java中FutureTask的使用

    文章目录 FutureTask简介 Callable和Runnable的转换 以Runnable运行 java中FutureTask的使用 FutureTask简介 FutureTask是java 5 ...

  6. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数

    java 函数式编程 示例 这是第8部分,该系列的最后一部分称为"示例功能Java". 我在本系列的每个部分中开发的示例是某种"提要处理程序",用于处理文档. ...

  7. java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式

    java 函数式编程 示例 功能编程(FP)的目的是避免重新分配变量,避免可变的数据结构,避免状态并全程支持函数. 如果将功能性技术应用于日常Java代码,我们可以从FP中学到什么? 在这个名为&qu ...

  8. java 静态缓存示例_Java 9 JShell示例:集合静态工厂方法

    java 静态缓存示例 这篇文章继续从My My Java 9 Features博客文章中探索Java9功能. 在这里,我们在List,Set和Map接口中试验Java9 Collections静态工 ...

  9. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

    java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...

最新文章

  1. 吴恩达Coursera机器学习 - Chapter 4 多变量线性回归
  2. 宝塔面板使用阿里云ssl证书
  3. 代码 控制unity 暂停 编辑器_Unity3D 报错解决方案及常用功能收集
  4. 清华出版社送书 50 本,倒计时!
  5. 【转】Memcached管理与监控工具----MemAdmin
  6. 笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)...
  7. 手把手教你如何免费且光荣地使用专业版IntelliJ IDEA
  8. Linux服务器安全防护十个方面
  9. c语言洗牌发牌结构体,C语言程序设计课程设计多功能计算器、洗牌发牌、学生文件处理、链表处理.doc...
  10. 神秘的中国超级计算机:比肩高铁的世界级领先
  11. C++类成员属性的一种简洁实现
  12. sql之stuff函数学习笔记
  13. qt银行排队系统服务器代码,QT银行叫号排队系统
  14. c语言注释部分两侧的分界符号分别是,单片机C语言练习题
  15. VSCode如何返回上一步
  16. Toad oracle
  17. CentOS 识别NTFS格式U盘
  18. [ArcGIS] 空间分析(五) 网络分析
  19. Android工具类的整理
  20. 04_NetBean安裝

热门文章

  1. 前置机与虚拟服务器,前置机跟服务器的关系
  2. MyBatisPlus Service层的CRUD
  3. 论文翻译:2018_Speech Bandwidth Extension Using Generative Adversarial Networks
  4. gta python解指纹_python爬虫JS逆向:X咕视频密码与指纹加密分析
  5. 精通 Python OpenCV4:第三、四部分
  6. 银联无感支付自动缴费不停车快速离场
  7. 【智能扭矩系统】主机厂常见的紧固件扭矩质量的控制方法有哪些?
  8. 罗永浩 你的锤子呢?
  9. VScode 打不开浏览器,更改默认浏览器
  10. oracle删除表并释放空间,oracle删除(释放)数据文件/表空间流程