简析Java中的util.concurrent.Future接口
java.util.concurrent.Future
是Java中实现异步操作和并发编程的一个核心接口,它的主要作用是提供一个机制,允许异步任务返回一个结果和处理异常,这个结果将在未来的某个时间点通过Future
对象来获取。即,当我们发起一个异步请求后,系统会立即返回一个Future
对象,通过这个对象来获取异步操作的结果。
Future接口的基本用法
Java中的Future
接口定义了下面的几个方法:
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
其中,最常用的是get()
方法,它将会阻塞当前线程,直到异步操作返回一个结果:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
Thread.sleep(2000);
return "Hello, World!";
});
System.out.println("Waiting for result...");
String result = future.get();
System.out.println("Result: " + result);
executor.shutdown();
运行结果:
Waiting for result...
Result: Hello, World!
这里,我们创建了一个ExecutorService
,通过submit()
方法提交了一个异步任务,返回了一个Future
对象,然后我们通过get()
方法来等待异步任务完成并返回结果。需要注意的是,如果异步任务还没有完成,当前线程将会一直处于阻塞状态。
Future接口的高级用法
接下来,我们来看几个高级用法。
1. 处理超时
在get()
方法中,可以传入两个参数,第一个参数表示超时时间,第二个参数表示超时时间的单位。如果异步任务在指定的时间内没有返回结果,那么将会抛出一个TimeoutException
异常:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
Thread.sleep(2000);
return "Hello, World!";
});
System.out.println("Waiting for result...");
try {
String result = future.get(1, TimeUnit.SECONDS);
System.out.println("Result: " + result);
} catch (TimeoutException e) {
System.out.println("Timeout!");
}
executor.shutdown();
运行结果:
Waiting for result...
Timeout!
这里,我们传入了一个超时时间为1秒的参数,由于异步任务需要2秒才能返回结果,因此在1秒后,get()
方法就会抛出一个TimeoutException
异常。
2. 取消异步任务
Future
接口提供了cancel()
方法来取消异步任务。在调用cancel()
方法时,会尝试去中断异步任务,中断的方式取决于mayInterruptIfRunning
参数的值,如果设置为true
,则会中断正在运行中的任务,否则将会忽略正在运行的任务而仅取消尚未执行的任务。
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
Thread.sleep(2000);
return "Hello, World!";
});
System.out.println("Waiting for result...");
future.cancel(true);
if(future.isCancelled()) {
System.out.println("Task cancelled!");
}
executor.shutdown();
运行结果:
Waiting for result...
Task cancelled!
这里,我们调用了cancel()
方法,同时将mayInterruptIfRunning
参数设置为true
,这样在异步任务运行期间,任务线程就会被中断。
总结
Future
接口为Java中的并发编程提供了一个很重要的基础,它提供了异步操作的便利,使得我们可以方便的在未来的某个时间点获取处理的结果或者处理异常。我们可以通过get()
方法等待异步操作返回结果,也可以通过cancel()
方法取消异步操作,这些方法可以满足我们大多数日常需要。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简析Java中的util.concurrent.Future接口 - Python技术站