gpt4 book ai didi

java - FutureTask的两种用法有什么区别?

转载 作者:行者123 更新时间:2023-12-02 09:22:20 27 4
gpt4 key购买 nike

使用线程池:

ExecutorService exec = Executors.newFixedThreadPool(5);
FutureTask<Integer> ft = new FutureTask<Integer>(() -> rpcMethod());
exec.submit(ft);

调用run方法:

FutureTask<Integer> ft = new FutureTask<Integer>(() -> rpcMethod());
ft.run()

我看了一下run方法源码,好像是同步调用,好像没有新建线程。之所以出现这个问题,是因为我查看了Dubbo的RpcContext#asyncCall的源码,发现它是直接使用FutureTask#run的。下面是部分代码。

public <T> Future<T> asyncCall(Callable<T> callable) {
try {
try {
setAttachment(Constants.ASYNC_KEY, Boolean.TRUE.toString());
final T o = callable.call();
//local调用会直接返回结果.
if (o != null) {
FutureTask<T> f = new FutureTask<T>(new Callable<T>() {
public T call() throws Exception {
return o;
}
});
f.run();
return f;
} else {

}

最佳答案

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()));
}

}

关于java - FutureTask的两种用法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58605075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com