java中有Future和FutureTask这两个类

Future是一个接口,代表可以取消的任务,并可以获得任务的执行结果

FutureTask 是基本的实现了Future和runnable接口
           实现runnable接口,说明可以把FutureTask实例传入到Thread中,在一个新的线程中执行。
           实现Future接口,说明可以从FutureTask中通过get取到任务的返回结果,也可以取消任务执行(通过interreput中断)

FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run方法,它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等

1.FutureTask执行多任务计算的使用场景

利用FutureTask和ExecutorService,可以用多线程的方式提交计算任务,主线程继续执行其他任务,当主线程需要子线程的计算结果时,在异步获取子线程的执行结果。

package cn.zhm.day3;

import java.util.ArrayList;
import java.util.List;
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; public class FutureTaskForMultiCompute { public static void main(String[] args) throws InterruptedException,
ExecutionException {
FutureTaskForMultiCompute inst = new FutureTaskForMultiCompute();
// 创建任务集合
List<FutureTask<Integer>> taskList = new ArrayList<FutureTask<Integer>>();
ExecutorService execut = Executors.newScheduledThreadPool(5);
for (int i = 0; i < 10; i++) {
// 传入Callable对象创建FutureTask对象
// inst.new ComputeTask(i, " "+i); 不太明白什么意思
FutureTask<Integer> task = new FutureTask<Integer>(
inst.new ComputeTask(i, "" + i));
// 把多个future放在集合中
taskList.add(task);
// 提交给线程池执行任务,也可以通过exec.invokeAll(taskList)一次性提交所有任务;
execut.submit(task);
System.out.println("所有计算任务提交完毕, 主线程接着干其他事情!");
}
Integer result = 0;
// 从future中取出值来
for (FutureTask<Integer> future : taskList) {
result = result + future.get();
}
// 打印求出来的值
System.out.println("result=" + result);
} public class ComputeTask implements Callable<Integer> {
private Integer result = 0;
private String taskName = ""; ComputeTask(Integer result, String taskName) {
this.result = result;
this.taskName = taskName;
System.out.println("生成子线程计算任务: " + taskName);
} public String getTaskName() {
return this.taskName;
} @Override
public Integer call() throws Exception {
for (int i = 0; i < 10; i++) {
result += i; }
Thread.sleep(5000);
System.out.println("子线程计算任务: " + taskName + " 执行完成!");
return result;
} }
}

  

Future和FutureTask的区别的更多相关文章

  1. Java中的Runnable、Callable、Future、FutureTask的区别与示例

    Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...

  2. Java中的Runnable、Callable、Future、FutureTask的区别

    本文转载自:http://blog.csdn.net/bboyfeiyu/article/details/24851847 Runnable 其中Runnable应该是我们最熟悉的接口,它只有一个ru ...

  3. Runnable、Callable、Future、FutureTask的区别

    转自:https://blog.csdn.net/jdsjlzx/article/details/52912701 FutureTask既是Future.Runnable,又是包装了Callable( ...

  4. Callable、Future和FutureTask区别

    在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就 ...

  5. Runnable、Callable、Future和FutureTask用法

    http://www.cnblogs.com/dolphin0520/p/3949310.html java 1.5以前创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable ...

  6. Java并发编程:Callable、Future和FutureTask的实现

    启动线程执行任务,如果需要在任务执行完毕之后得到任务执行结果,可以使用从Java 1.5开始提供的Callable和Future 下面就分析一下Callable.Future以及FutureTask的 ...

  7. 【Java并发编程】Callable、Future和FutureTask的实现

    启动线程执行任务,如果需要在任务执行完毕之后得到任务执行结果,可以使用从Java 1.5开始提供的Callable和Future 下面就分析一下Callable.Future以及FutureTask的 ...

  8. java中Future与FutureTask使用与分析

    Future与FutureTask都是用于获取线程执行的返回结果.下面我们就对两者之间的关系与使用进行一个大致的介绍与分析 一.Future与FutureTask介绍: Future位于java.ut ...

  9. Java Future 和 FutureTask 源码Demo

    Future 是一个接口,看源码有Future 和 FutreTask 使用Demo package java.util.concurrent; /** * A <tt>Future< ...

随机推荐

  1. 攻防世界Web_ics_05

    题目: 题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统 题目场景:   1.进入云平台设备中心界面,查看以下源码发现?page= ,(点下云平台设备维护中心url里也能出?page ...

  2. web渗透绕过

    ////目录: 403 IP地址绕过与文件名绕过 登录框绕过 SQL注入绕过 文件上传绕过 RCE绕过 403 IP地址绕过与文件名绕过 X-Forwarded-For:127.0.0.1 X-For ...

  3. WPF 开发,优化 AvalonEdit 显示单行超长文本的性能。

    路遥工具箱内置了一个名为"JSON 格式化"的功能.通过该功能可以将 JSON 字符串进行美化和简化(设置缩进和取消缩进). 该功能上线后收到很多客户的反馈:大部分经由网络传输的J ...

  4. RabbitMQ安装以及简单操作应用(针对Windows和C#)

    1.RabbitMQ安装 1.1下载并安装Erlang https://www.erlang.org/downloads 一直点next就安装好了.我直接使用了默认的安装目录.否则的话,应该需要配置一 ...

  5. WPF中使用OpenFileDialog打开文件

    添加Microsoft.Win32程序集 private void OnOpenFile(object sender, EventArgs e) { OpenFileDialog openFileDi ...

  6. navicat12.0.24安装注意事项

    关闭防火墙并断网,或者不要改变安装路径,或者换一个注册机 链接:https://pan.baidu.com/s/1AvEuD6TWGOCisSctF7pcbg  提取码:o4wp

  7. C# HttpRequest 请求

    public static string Post(string Url, string postDataStr, string cookies) { HttpWebRequest request = ...

  8. 【实测】Python 和 C++ 下字符串查找的速度对比

    完整格式链接:https://blog.imakiseki.cf/2022/03/07/techdev/python-cpp-string-find-perf-test/ 背景 最近在备战一场算法竞赛 ...

  9. tp6 验证方式

    think验证方式

  10. laravel 怎么获取public路径

    app_path()   app_path函数返回app目录的绝对路径: $path = app_path();   你还可以使用app_path函数为相对于app目录的给定文件生成绝对路径: $pa ...