对于这三者首先我们看下源码,之后在分别写几个demo讲解下用法:
public interface RunnableFuture<V> extends Runnable, Future<V> {
void run();
}
public class FutureTask<V> implements RunnableFuture<V> {}
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
V get() throws InterruptedException, ExecutionException;
}
关系一目了然,我们首先使用下FutureTask ,下面简单写一个demo
FutureTask<Boolean> futureTask = new FutureTask<>(() -> false);
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Boolean> future = (Future<Boolean>) executor.submit(futureTask);
try {
System.out.println("future:"+future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
try {
boolean rs = futureTask.get(1, TimeUnit.MINUTES);
System.out.println(rs);
} catch (InterruptedException e) {
System.out.println("执行被中断");
e.printStackTrace();
} catch (ExecutionException e) {
System.out.println("执行过程出错");
e.printStackTrace();
} catch (TimeoutException e) {
System.out.println("时间超时");
e.printStackTrace();
}finally {
executor.shutdown();
}
}
输出结果:
future:null
false
为什么 Future<Boolean> future = (Future<Boolean>) executor.submit(futureTask); 拿不到执行结果呢, 我们知道 executor.submit()如果执行的是runable接口方法返回值是null,下面改写下代码:
FutureTask<Boolean> futureTask = new FutureTask<>(() -> false);
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Boolean> future = executor.submit(() -> true);
executor.execute(futureTask);
executor.submit(futureTask);
try {
System.out.println("future:"+future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
try {
boolean rs = futureTask.get(3, TimeUnit.SECONDS);

本文详细剖析FutureTask与ExecutorService协作,通过实例演示Future.get()获取结果的机制,解释为何submit返回null及多任务执行顺序。涉及的关键步骤包括任务提交、线程池调度与执行。
最低0.47元/天 解锁文章
4901

被折叠的 条评论
为什么被折叠?



