Java并发工具类Future使用示例

 更新时间:2022-06-04 00:17:10   作者:佚名   我要评论(0)

目录前言Future使用示例FutureTask前言
Future是一个接口类,定义了5个方法:
boolean cancel(boolean mayInterruptIfRunning);
boolean isC

前言

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
@ToString
class 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • java并发编程工具类JUC之LinkedBlockingQueue链表队列
  • Java并发工具类LongAdder原理实例解析
  • Java线程并发工具类CountDownLatch原理及用法
  • 了解JAVA Future类
  • java多线程Future和Callable类示例分享
  • java自定义任务类定时执行任务示例 callable和future接口使用方法

相关文章

  • Java并发工具类Future使用示例

    Java并发工具类Future使用示例

    目录前言Future使用示例FutureTask前言 Future是一个接口类,定义了5个方法: boolean cancel(boolean mayInterruptIfRunning); boolean isC
    2022-06-04
  • 在页面加载之后执行JavaScript

    在页面加载之后执行JavaScript

    我们都知道,页面加载是有顺序的。让我们先来理一下页面的展示过程: 当你输入url并按下回车时 首先从本地查找域名,有的话直接用hosts文件里
    2022-06-04
  • JS实现页面滚动到关闭时的位置与不滚动效果

    JS实现页面滚动到关闭时的位置与不滚动效果

    目录滚动不滚动标题显而易见,要说两种情况:重新打开页面或者返回某个页面时滚动到上次离开时的位置,以及不滚动保持在顶部。 滚动 这也有两
    2022-06-04
  • Android项目开发常用工具类LightTaskUtils源码介绍

    Android项目开发常用工具类LightTaskUtils源码介绍

    目录LightTaskUtils概述LightTaskUtils截图LightTaskUtils源码版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfh
    2022-06-04
  • C++和OpenCV实现图像字符化效果

    C++和OpenCV实现图像字符化效果

    目录实现原理功能函数代码作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 图
    2022-06-04
  • Java深入分析讲解反射机制

    Java深入分析讲解反射机制

    目录反射的概述获取Class对象的三种方式通过反射机制获取类的属性通过反射机制访问Java对象的属性反射机制与属性配置文件的配合使用资源绑定
    2022-06-04
  • netty 实现tomcat的示例代码

    netty 实现tomcat的示例代码

    目录netty 实现tomcat自定义基础类netty 服务端使用测试netty 实现tomcat 自定义基础类 TomcatServlet public abstract class TomcatServlet
    2022-06-04
  • Java超详细讲解排序二叉树

    Java超详细讲解排序二叉树

    目录排序二叉树概念排序二叉树类的定义添加节点中序遍历查找节点查找某一节点的父节点删除节点排序二叉树概念 二叉排序树(Binary Sort Tree
    2022-06-04
  • 深入解析vue中的权限管理

    深入解析vue中的权限管理

    目录vue要做权限管理该怎么做?一、是什么二、如何做接口权限路由权限控制菜单权限方案一方案二按钮权限方案一方案二小结vue要做权限管理该怎
    2022-06-04
  • Java超详细分析讲解哈希表

    Java超详细分析讲解哈希表

    目录哈希表概念哈希函数的构造平均数取中法折叠法保留余数法哈希冲突问题以及解决方法开放地址法再哈希函数法公共溢出区法链式地址法哈希表的
    2022-06-04

最新评论