本文主要是介绍FutureTask通常如何使用?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
FutureTask
是一种有用的工具,用于管理并发编程中可取消的、可监听的任务。它通常被用来包装 Callable
或 Runnable
对象,并在单独的线程中执行这些任务。以下是一些使用 FutureTask
的典型场景和步骤:
1. 包装 Callable
或 Runnable
下面是基本的包装 Callable
和 Runnable
的方法:
// 使用 Callable
Callable<Integer> callable = () -> {// 模拟长时间的任务Thread.sleep(1000);return 123;
};FutureTask<Integer> futureTask = new FutureTask<>(callable);// 使用 Runnable
Runnable runnable = () -> {// 模拟长时间的任务try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}
};
FutureTask<Void> futureTask2 = new FutureTask<>(runnable, null);
2. 提交任务
可以通过 Thread
或 ExecutorService
提交 FutureTask
并执行任务:
通过 Thread
:
Thread thread = new Thread(futureTask);
thread.start();
通过 ExecutorService
:
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
executor.shutdown();
3. 获取结果
使用 FutureTask
的 get
方法可以获取任务的执行结果:
try {Integer result = futureTask.get();System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}
如果需要带超时限制的获取,可以使用带超时参数的 get
方法:
try {Integer result = futureTask.get(500, TimeUnit.MILLISECONDS);System.out.println("Result with timeout: " + result);
} catch (TimeoutException e) {System.out.println("Task timed out");
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}
4. 取消任务
可以使用 cancel
方法取消任务,如果任务正在运行,你可以选择是否允许中断:
boolean mayInterruptIfRunning = true;
futureTask.cancel(mayInterruptIfRunning);if (futureTask.isCancelled()) {System.out.println("Task was cancelled");
} else {System.out.println("Task was not cancelled");
}
5. 完整示例
下面是一个完整的示例,展示如何使用 FutureTask
包装一个 Callable
任务,并通过 ExecutorService
提交任务执行,同时获取结果并处理取消:
import java.util.concurrent.*;public class FutureTaskExample {public static void main(String[] args) {// 创建一个 Callable 对象Callable<Integer> callable = () -> {System.out.println("Task started");Thread.sleep(2000); // 模拟长时间任务System.out.println("Task completed");return 123;};// 创建 FutureTaskFutureTask<Integer> futureTask = new FutureTask<>(callable);// 使用 ExecutorService 提交 FutureTaskExecutorService executor = Executors.newSingleThreadExecutor();executor.submit(futureTask);// 主线程可以执行其他任务System.out.println("Main thread is doing something else");try {// 获取任务的结果Integer result = futureTask.get(1, TimeUnit.SECONDS);System.out.println("Result from FutureTask: " + result);} catch (InterruptedException e) {System.out.println("Task was interrupted");} catch (ExecutionException e) {System.out.println("Task encountered an execution exception");} catch (TimeoutException e) {System.out.println("Task timed out");futureTask.cancel(true); // 取消任务System.out.println("Task was cancelled: " + futureTask.isCancelled());} finally {// 关闭 Executor 服务executor.shutdown();}}
}
在这个示例中,FutureTask
包装一个 Callable
对象,并由 ExecutorService
执行。主线程可以执行其他任务,并通过 futureTask.get()
方法获取任务结果。超时发生时任务会被取消。
这篇关于FutureTask通常如何使用?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!