Java并发工具类Future使用示例

 更新时间:2022年06月03日 17:17:28   作者:码拉松  
这篇文章主要介绍了Java并发工具类Future使用示例,本文需要注意future.get()方法是阻塞式的,如果调用该方法的时候任务尚未执行完成,则会一直等待下去,直到任务执行结束,本文通过示例代码给大家介绍的非常详细,需要的朋友参考下吧

前言

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中HashMap键的比较方式

    浅谈java中HashMap键的比较方式

    今天带大家了解一下java中HashMap键的比较方式,文中有非常详细的解释说明及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • 详解Spring DeferredResult异步操作使用场景

    详解Spring DeferredResult异步操作使用场景

    本文主要介绍了Spring DeferredResult异步操作使用场景,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Spring MVC中JSON数据处理方式实战案例

    Spring MVC中JSON数据处理方式实战案例

    Spring MVC是个灵活的框架,返回JSON数据的也有很多五花八门的方式,下面这篇文章主要给大家介绍了关于Spring MVC中JSON数据处理方式的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java基础之浅谈hashCode()和equals()

    Java基础之浅谈hashCode()和equals()

    今天给大家带来的是关于Java基础的相关知识,文章围绕着hashCode()和equals()展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 聊聊Spring Cloud Cli 初体验

    聊聊Spring Cloud Cli 初体验

    这篇文章主要介绍了聊聊Spring Cloud Cli 初体验,SpringBoot CLI 是spring Boot项目的脚手架工具。非常具有实用价值,需要的朋友可以参考下
    2018-04-04
  • Java 之类型转换与多态详情

    Java 之类型转换与多态详情

    Java使用类创造新的类型(type),并使用继承来便利我们创建类。再深一层讲类型,并是多态(polymorphism)的概念。本文将给大家介绍Java 的类型转换与多态,需要的小伙伴可以参考下面文章的具体内容
    2021-09-09
  • Java多线程编程中的线程死锁的问题解决

    Java多线程编程中的线程死锁的问题解决

    线程死锁是多线程编程中的一个常见问题,它发生在多个线程互相等待对方释放资源的情况下,导致程序无法继续执行,本文就来介绍一下Java多线程编程中的线程死锁的问题解决,感兴趣的可以了解一下
    2023-08-08
  • Java 8函数式接口之BinaryOperator使用示例详解

    Java 8函数式接口之BinaryOperator使用示例详解

    这篇文章主要大家介绍了Java 8函数式接口之BinaryOperator,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Dubbo异步调用的实现介绍

    Dubbo异步调用的实现介绍

    dubbo默认使用同步的方式调用。但在有些特殊的场景下,我们可能希望异步调用dubbo接口,从而避免不必要的等待时间,这时候我们就需要用到异步。那么dubbo的异步是如何实现的呢?下面就来看看这个问题
    2022-09-09
  • Spring Boot 直接用jar运行项目的方法

    Spring Boot 直接用jar运行项目的方法

    这篇文章主要介绍了Spring Boot 直接用jar运行项目的方法,非常不错,具有参考借鉴价值,需要的朋友参考下
    2018-02-02

最新评论