我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java并发工具类Future如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java并发工具类Future如何使用

这篇文章主要讲解了“Java并发工具类Future如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发工具类Future如何使用”吧!

前言

Future是一个接口类,定义了5个方法:

boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

通过这5个方法可以看出,Future不但可以获取提交任务的执行结果,甚至还可以取消任务。

Future使用示例

摘自JDK中Future示例代码

class ArchiveSearcherImpl implements ArchiveSearcher{    @Override    public String search(String target) {        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        return target;    }}interface ArchiveSearcher {    String search(String target);}class App {    public static void main(String[] args) throws InterruptedException {        App app = new App();        app.showSearch("search");    }    ExecutorService executor = Executors.newSingleThreadExecutor();    ArchiveSearcher searcher = new ArchiveSearcherImpl();    void showSearch(final String target)            throws InterruptedException {        // 提交任务        Future<String> future                = executor.submit(new Callable<String>() {            public String call() {                return searcher.search(target);            }        });        displayOtherThings(); // do other things while searching        try {        // 拿任务执行结果            displayText(future.get()); // use future        } catch (ExecutionException ex) {            //cleanup();            return;        }    }    private void displayOtherThings() {        System.out.println("do other things");    }    private void displayText(String s) {        System.out.println(s);    }}

注意:future.get()方法是阻塞式的,如果调用该方法的时候任务尚未执行完成,则会一直等待下去,直到任务执行结束。

ExecutorService还有一个sumbit方法比较特殊:<T> Future<T> submit(Runnable task, T result);这个方法可以先把result这个参数传给task使用,然后再通过get方法把result返回。

public class FutureTest {    public static void main(String[] args) throws ExecutionException, InterruptedException {        ExecutorService executor = Executors.newSingleThreadExecutor();        MyResult myResult = new MyResult();        MyTask myTask = new MyTask(myResult);// 提交任务后,在任务中操作myResult        Future<MyResult> future = executor.submit(myTask, myResult);        // 最后get方法可以拿到myResult        System.out.println(future.get());    }}class MyTask implements Runnable {    private MyResult myResult;    public MyTask(MyResult myResult) {        this.myResult = myResult;    }    @Override    public void run() {        myResult.setCode("10000");    }}@Data@ToStringclass MyResult {    private String code;}

FutureTask

FutureTask是一个实现了Runnable和Future接口的工具类,结合了这两个接口的能力,FutureTask即可以提交给线程任务执行,又可以获取到执行结果。

具体代码示例:

import java.util.concurrent.*;public class FutureTaskTest {    public static void main(String[] args) throws ExecutionException, InterruptedException {        FutureTask<String> futureTask1 = new FutureTask<>(new MyTask1());        FutureTask<String> futureTask2 = new FutureTask<>(new MyTask2());        ExecutorService executorService = Executors.newFixedThreadPool(2);        executorService.submit(futureTask1);        executorService.submit(futureTask2);        long start = System.currentTimeMillis();        System.out.println(futureTask1.get());        System.out.println(futureTask2.get());        long end = System.currentTimeMillis();        System.out.println(end - start);    }}class MyTask2 implements Callable<String> {    @Override    public String call() {        try {            Thread.sleep(2000);        } catch (InterruptedException e) {            e.printStackTrace();        }        return "MyTask2 over";    }}class MyTask1 implements Callable<String> {    @Override    public String call() {        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        return "MyTask1 over";    }}

感谢各位的阅读,以上就是“Java并发工具类Future如何使用”的内容了,经过本文的学习后,相信大家对Java并发工具类Future如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java并发工具类Future如何使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java并发工具类Future如何使用

这篇文章主要讲解了“Java并发工具类Future如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发工具类Future如何使用”吧!前言Future是一个接口类,定义了5个方
2023-06-30

浅析Java中并发工具类的使用

在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类提供了在线程间交换数据的一种方法。本文主要介绍了它们的使用,需要的可以参考一下
2022-12-08

如何在Java中使用Semaphore工具类

这篇文章将为大家详细讲解有关如何在Java中使用Semaphore工具类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、Semaphore的理解Semaphore属于java.util.c
2023-06-15

如何在java中使用 Arrays工具类

如何在java中使用 Arrays工具类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Arrays工具类属于java中常用的工具类public static void so
2023-05-31

如何在Java中使用EasyExcel工具类

今天就跟大家聊聊有关如何在Java中使用EasyExcel工具类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web M
2023-06-14

如何在Java中使用Collections工具类

本篇文章为大家展示了如何在Java中使用Collections工具类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数
2023-06-14

Java并发包工具类CountDownLatch的应用详解

CountDownLatch是Java并发包中非常实用的一个工具类,它可以帮助我们实现线程之间的同步和协作。本文主要介绍了CountDownLatch的应用场景及最佳实践,希望对大家有所帮助
2023-05-18

如何在Java中使用Hutool工具类库

这篇文章将为大家详细讲解有关如何在Java中使用Hutool工具类库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。HuTool 中的一些常用工具类我们引入这个工具类很简单,直接在 Mavan
2023-06-14

Java中如何实现AQS共享模式与并发工具类

这篇文章主要为大家展示了“Java中如何实现AQS共享模式与并发工具类”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中如何实现AQS共享模式与并发工具类”这篇文章吧。使用示例下面这个例子
2023-06-02

在Java中如何使用Callable、Future进行并行编程

这篇文章将为大家详细讲解有关在Java中如何使用Callable、Future进行并行编程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用Callable、Future进行并行编程在Java中进行并行编
2023-05-30

如何深入理解Java多线程与并发框中的并发辅助工具类

如何深入理解Java多线程与并发框中的并发辅助工具类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Exchanger 交换器(两线程间的通信)使用场景:用于 有且仅有两个线
2023-06-05

Java中如何使用ZipUtil压缩文件工具类

这篇文章给大家介绍Java中如何使用ZipUtil压缩文件工具类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体如下:package com.utility.zip;import java.io.BufferedIn
2023-05-30

如何使用axis调用WebService及Java WebService调用工具类

Axis是一个基于Java的Web服务框架,可以用来调用Web服务接口,下面这篇文章主要给大家介绍了关于如何使用axis调用WebService及Java WebService调用工具类的相关资料,需要的朋友可以参考下
2023-05-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录