futuretask使用

FutureTask是Java中的一个类,它实现了RunnableFuture接口,用于异步执行任务并获取结果。以下是使用FutureTask的基本步骤和示例:

创建FutureTask

创建FutureTask实例需要传入一个实现了Callable接口的对象或者一个Runnable对象。Callable接口允许任务返回一个结果,并且可以抛出异常。

// 使用Callable创建FutureTask
Callable<Integer> callable = new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {
        // 模拟耗时操作
        Thread.sleep(2000);
        return 42;
    }
};
FutureTask<Integer> futureTask = new FutureTask<>(callable);

执行FutureTask

可以通过Thread直接执行FutureTask,或者提交给ExecutorService

// 通过Thread执行FutureTask
Thread thread = new Thread(futureTask);
thread.start();

// 通过ExecutorService执行FutureTask
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);

获取结果

使用get()方法等待计算完成并获取其结果。如果任务未完成,get()方法会阻塞。

// 获取任务结果
try {
    Integer result = futureTask.get();
    System.out.println("任务结果: " + result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

取消任务

可以使用cancel()方法取消任务的执行。如果任务已经完成、已经取消或者由于其他原因而不能被取消,则cancel()方法将返回false

// 取消任务
boolean cancelled = futureTask.cancel(true);
if (cancelled) {
    System.out.println("任务已取消");
} else {
    System.out.println("任务无法取消");
}

使用场景

  • 异步计算 :FutureTask用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

  • 确保任务只执行一次 :在高并发环境下,FutureTask的特性可以确保某些任务只执行一次。

  • 资源预加载 :FutureTask可以用于预先加载资源,当需要使用时,通过get()方法获取。

注意事项

  • get()方法只能调用一次,因为一旦调用,任务就会结束,无法再次启动或取消。

  • 如果任务被取消,get()方法会抛出CancellationException异常。

以上就是使用FutureTask的基本方法。

Top