一、工具类编写
import java.util.concurrent.*;
public class AsyncUtils {
private static final ExecutorService executorService = Executors.newFixedThreadPool(10);
/**
* 异步执行任务并返回Future对象
* @param task 实现Callable接口的任务
* @param <V> 任务返回类型
* @return 代表任务进度的Future对象
*/
public static <V> Future<V> executeAsync(Callable<V> task) {
return executorService.submit(task);
}
/**
* 获取异步任务的结果,如果任务未完成则等待指定时间
* @param future 异步任务的Future对象
* @param timeout 超时时间
* @param unit 时间单位
* @param <V> 任务返回类型
* @return 任务返回的结果,如果任务在指定时间内未完成则返回null
*/
public static <V> V getAsyncResult(Future<V> future, long timeout, TimeUnit unit) {
try {
return future.get(timeout, unit);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
// 异常处理逻辑
e.printStackTrace(); // 仅打印异常,实际应用中应根据需要处理异常
return null;
}
}
}
二、调用
public class AsyncExample {
public static void main(String[] args) {
Callable<String> task = () -> {
// 模拟耗时操作
Thread.sleep(2000);
return "任务完成";
};
Future<String> future = AsyncUtils.executeAsync(task);
String result = AsyncUtils.getAsyncResult(future, 3, TimeUnit.SECONDS);
if (result != null) {
System.out.println("异步任务结果: " + result);
} else {
System.out.println("未能获取到任务结果");
}
}
}
三、说明
在这个示例中,我们定义了一个异步工具类AsyncUtils
,它提供了执行异步任务的executeAsync
方法和获取异步结果的getAsyncResult
方法。getAsyncResult
方法使用了Future.get
方法并捕获了可能出现的异常,并在异常发生时进行了简单的处理(例如打印堆栈跟踪)。使用Executors.newFixedThreadPool
创建了一个固定大小的线程池用于异步任务的执行。