FutureTask является реализацией Runnable.
разница составляет
, если вы используете exec.submit (ft) ;его асинхронность выполняется в двух разных потоках.
, если вы используете ft.run () ;он был выполнен в том же потоке.
Если есть какие-либо сомнения, попробуйте это. Я поместил getResult () в другой метод, чтобы у вас был более явный стек вызовов:
public class FutureExample {
private Callable<Long> call = new Callable<Long>() {
private Long getResult(){
return Thread.currentThread().getId();
}
@Override
public Long call() {
return getResult();
}
};
private Long callByRun() throws ExecutionException, InterruptedException {
FutureTask<Long> ft = new FutureTask<>(call);
ft.run();
return ft.get();
}
private Long callByExec() throws ExecutionException, InterruptedException {
ExecutorService pool = Executors.newFixedThreadPool(5);
FutureTask<Long> ft = new FutureTask<>(call);
pool.submit(ft);
Long result = ft.get();
pool.shutdown();
return result;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Long mainThreadId = Thread.currentThread().getId();
System.out.println(String.format("main: %d callByRun %d", mainThreadId, new FutureExample().callByRun()));
System.out.println(String.format("main: %d callByExec %d", mainThreadId, new FutureExample().callByExec()));
}
}