Java中Future和FutureTask的示例详解及使用
1. 简介
Java中的Future
和FutureTask
都是用于异步执行任务的工具类。在某些场景下,任务执行需要花费较长时间,为了避免阻塞主线程或者降低用户体验,可以使用Future
和FutureTask
来实现任务的异步执行和结果的获取。
Future
用于表示异步任务的结果,并提供了相应的方法来查询任务是否完成、等待任务完成或者取消任务。而FutureTask
则是Future
的实现类,它除了继承Future
之外,还实现了Callable
接口,因此可以使用FutureTask
来直接提交异步任务,返回结果也可以使用FutureTask
来实现。
2. 使用场景
Future
和FutureTask
可以广泛应用于多线程、网络编程、时间轴和异步编程等场景。其中一些具体场景包括:
- 多线程编程中需要实现异步执行任务
- 网络编程中需要异步获取数据
- 时间轴中需要异步执行任务
- 需要在异步编程中获取异步任务之后的结果
3. 示例说明
以下两个示例代码将演示使用Future
和FutureTask
来异步执行任务和获取结果。
示例一:使用Future异步执行任务并获取结果
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class FutureExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
Future<Integer> future = executor.submit(() -> {
Thread.sleep(1000);
return 666;
});
System.out.println("任务提交成功...");
while (!future.isDone()) {
System.out.println("等待任务完成...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Integer result = future.get();
System.out.println("异步任务结果为:" + result);
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown();
}
}
以上代码中,我们通过executor.submit()
方法将一个任务提交给线程池去执行。任务返回Future
对象,我们可以使用future.isDone()
和future.get()
方法来获取任务是否执行完成和任务返回的结果。在上述示例中,我们使用了一个while
循环来等待任务完成,循环内部可以进行一些其他操作。当任务完成后,我们调用future.get()
方法获取任务结果。
示例二:使用FutureTask异步执行任务并获取结果
import java.util.concurrent.FutureTask;
public class FutureTaskExample {
public static void main(String[] args) {
FutureTask<Integer> futureTask = new FutureTask<>(() -> {
Thread.sleep(1000);
return 888;
});
Thread thread = new Thread(futureTask);
thread.start();
System.out.println("任务提交成功...");
while (!futureTask.isDone()) {
System.out.println("等待任务完成...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Integer result = futureTask.get();
System.out.println("异步任务结果为:" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上代码中,我们创建了一个FutureTask
对象,然后将其传递给一个新线程去执行。我们也是使用了一个while
循环来等待任务执行完成。当任务完成后,我们调用futureTask.get()
方法获取任务结果。
4. 总结
Future
和FutureTask
是Java中异步编程的利器,可以方便地实现任务的异步执行和结果获取。在实际开发中,可以根据需求选择合适的工具类来实现异步任务和结果的获取。在使用Future
和FutureTask
时,需要充分理解其基本原理和常见使用方法,以避免一些常见的错误。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中Future和FutureTask的示例详解及使用 - Python技术站