赞
踩
FutureTask 是 Java 并发包中的一个重要类,它实现了 RunnableFuture 接口,结合了 Future 和 Runnable 的特性。FutureTask 通常用于异步任务的执行和结果的获取。
如下几个问题,大家看看有没有思考过,在后面阅读源码的过程中都会解答:
Runnable 接口是一个函数式接口,定义了一个 run 方法,用于包含需要在新线程中执行的代码。
@FunctionalInterface
public interface Runnable {
void run();
}
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;
}
RunnableFuture 接口继承了 Runnable 和 Future 接口,表示一个既可以作为任务执行(Runnable),又可以获取结果(Future)的任务。
public interface RunnableFuture<V> extends Runnable, Future<V> {
void run();
}
FutureTask 实现了 RunnableFuture 接口中的所有方法,并提供了一些额外的方法和机制来管理任务的执行和状态。
void run():执行任务,如果任务已完成或已取消则不执行。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class FutureTaskExample {
public static void main(String[] args) {
// 创建一个 Callable 任务
Callable<String> callableTask = () -> {
Thread.sleep(1000); // 模拟耗时操作
return "Task completed";
};
// 创建一个 FutureTask
FutureTask<String> futureTask = new FutureTask<>(callableTask);
// 提交给 Executor 执行
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
try {
// 获取结果(阻塞直到任务完成)
String result = futureTask.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
}
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class FutureTaskRunnableExample {
public static void main(String[] args) {
// 创建一个 Runnable 任务
Runnable runnableTask = () -> {
try {
Thread.sleep(1000); // 模拟耗时操作
System.out.println("Runnable task completed");
} catch (InterruptedException e) {
e.printStackTrace();
}
};
// 使用 Runnable 和结果值创建一个 FutureTask
FutureTask<String> futureTask = new FutureTask<>(runnableTask, "Task finished");
// 提交给 Executor 执行
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
try {
// 获取结果(阻塞直到任务完成)
String result = futureTask.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
}
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class FutureTaskCancelExample {
public static void main(String[] args) {
// 创建一个 Callable 任务
Callable<String> callableTask = () -> {
Thread.sleep(3000); // 模拟耗时操作
return "Task completed";
};
// 创建一个 FutureTask
FutureTask<String> futureTask = new FutureTask<>(callableTask);
// 提交给 Executor 执行
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
try {
// 等待一段时间后取消任务
Thread.sleep(1000);
boolean cancelled = futureTask.cancel(true);
System.out.println("Task cancelled: " + cancelled);
// 获取任务状态
if (!futureTask.isCancelled()) {
String result = futureTask.get();
System.out.println("Result: " + result);
} else {
System.out.println("Task was cancelled.");
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
}
可以调用 FutureTask 的 cancel 方法来取消任务:
futureTask.cancel(true); // 取消任务,true 表示如果任务正在运行,可以中断它
FutureTask 使用了内部状态和同步机制来确保线程安全。例如,它使用 CAS 操作和 volatile 变量来管理任务的状态(如未开始、正在运行、已完成、已取消等)。
可以在获取结果时处理异常:
try {
String result = futureTask.get();
} catch (InterruptedException e) {
// 处理线程中断异常
} catch (ExecutionException e) {
// 处理任务执行异常
Throwable cause = e.getCause(); // 获取实际异常原因
}
FutureTask 的 run 方法只能被调用一次。多次调用 run 方法不会重新执行任务,只会返回相同的结果或状态。
7.jdk源码阅读之ConcurrentHashMap(上)
8.jdk源码阅读之ConcurrentHashMap(下)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。