我是靠谱客的博主 年轻丝袜,这篇文章主要介绍java异步获取结果_java获取异步计算的结果,现在分享给大家,希望可以做个参考。

java Future/Callable/Executors

如何获取一个异步线程的结果呢?使用普通的方法是无法获取异步线程返回结果的,比如继承Thread类、实现Runnable接口这两种方式创建的异步线程是没有返回结果的。

public class Task implements Runnable {

public void run() {

}

}

run方法是没有返回值,并且无法抛出异常信息。只能在run方法内部直接try...catch处理。并不能throws到外层。

那么,针对这种情况如何处理呢?直接看代码吧。

import java.util.concurrent.Future;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Callable;

import java.util.concurrent.TimeUnit;

import java.util.Map;

import java.util.HashMap;

import java.util.List;

import java.util.ArrayList;

public class FutureTest {

public static void main(String[] args) throws Exception {

// 创建一个有返回值的异步线程

// 创建一个线程池

ExecutorService pool = Executors.newFixedThreadPool(10); //线程池默认容量为10个线程

MyTask task = new MyTask();

//pool.execute(task);

// 提交任务到线程池中,并获取任务返回结果

/*

Future result = pool.submit(new Callable() {

public Integer call() throws Exception {

return 100;

}

});

*/

Future result = pool.submit(task);

System.out.println("任务返回结果:" + result.get()); // result.get()会阻塞线程,等待任务执行完毕。

// 提交任务

Future> results = pool.submit(new MyTask2());

Map map = results.get();

System.out.println("map = " + map);

// 提交任务,这个任务耗时30秒

Future> results3 = pool.submit(new MyTask3());

try {

// get(long timeout, TimeUnit unit) 超时时间设置为15秒,15秒还是没返回结果则报超时异常

Map m = results3.get(15L, TimeUnit.SECONDS);

} catch (Exception e) {

System.out.println("任务执行超时了:" + e);

}

// 任务执行完毕后关闭线程池,实际应用中,可能不需要关闭线程池。可以一直保持着。

// 对于超时的任务仍然会等待(比如有一个任务执行了1个小时,但是超时时间设置为15秒,仍然会等到1小时)

// 直到所有任务执行完毕才关闭线程池

//pool.shutdown();

// 立即关闭线程池,不等待任务执行完毕。

//pool.shutdownNow();

// 主线程不会等待任务执行完毕才往下走。。但是线程池不会关闭,会一直存在。

System.out.println("============= main =================");

}

}

// 任务类

class MyTask implements Callable {

public Integer call() throws Exception {

return 100;

}

}

// 任务类2

class MyTask2 implements Callable> {

public Map call() throws Exception {

Map map = new HashMap();

map.put("msg", "成功");

List list = new ArrayList();

list.add("zhangsan");

list.add("李四");

list.add("王五");

map.put("result", list);

// 增加一个延迟,模拟执行耗时

Thread.sleep(2000);

return map;

}

}

// 任务类3, 模拟超时,在Future获取任务返回结果的时候设置一个超时时间。

class MyTask3 implements Callable> {

public Map call() throws Exception {

Map map = new HashMap();

map.put("msg", "成功");

List list = new ArrayList();

list.add("zhangsan");

list.add("李四");

list.add("王五");

map.put("result", list);

// 增加一个30秒延迟,模拟执行耗时

Thread.sleep(30000);

return map;

}

}

当你的系统有很多任务需要处理的时候使用这种方式很合适,而且还可以设置任务执行的超时时间,不会因为一直等待任务执行而导致主线程等待很久。

最后

以上就是年轻丝袜最近收集整理的关于java异步获取结果_java获取异步计算的结果的全部内容,更多相关java异步获取结果_java获取异步计算内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部