如何在java中获取线程异步执行之后的结果

来源:互联网 发布:淘宝买家封号怎么解封 编辑:程序博客网 时间:2024/05/21 14:00

java中提供了Future<V>接口和实现了Future接口的FutureTask<V> 类来将线程执行之后的结果返回(通过get()方法)。

1.Future<V>接口

Runnable接口执行任务是不返回任何值的,Runnable的run()方法的执行结果是void,而Future接口的call方法是有返回结果的,这是Runnable跟Future的区别之一,它们的另一个不同之处就是实现了Runnable接口的任务执行是调用ExecutorService的execute(Runnable task)方法,而实现了Future接口的任务是调用ExecutorService的submit(Future task)方法。调用Future的get()方法就能直接得到任务的返回值,该方法会一直阻塞直到任务的结果出来为止,我们可以调用Future的isDone()方法来判断该任务的结果是否准备就绪。

import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class TestFuture {public static void main(String[] args) throws InterruptedException, ExecutionException {ExecutorService executor = Executors.newCachedThreadPool();Future result1 = executor.submit(new Callable() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i < 10; i++) {sum += i;}return sum;}});Future result2 = executor.submit(new Callable() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 10; i < 100; i++) {sum += i;}return sum;}});executor.shutdown();System.out.println(result1.get() + result2.get());}}
2.FutureTask类
FutureTask实现了Future接口,将一个Callable实例作为参数传给它,就能创建一个FutureTask实例,然后用ExecutorService的submit方法来执行这个实例。最后同样是用get方法获取线程执行后的结果。
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 TestFutureTask {public static void main(String[] args) throws InterruptedException, ExecutionException {ExecutorService executor = Executors.newCachedThreadPool();Callable task = new Callable() {@Overridepublic String call() throws Exception {return "结果";}};FutureTask ft = new FutureTask(task);executor.submit(ft);System.out.println(ft.get());executor.shutdown();}}empty







阅读全文
2 0
原创粉丝点击