我刚刚遇到这样的代码:
ExecutorService executorService = MoreExecutors.sameThreadExecutor();
for (int i = 0; i < 10; i++) {
executorService.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
try {
Do some work here...
return null;
} catch (final Exception e) {
throw e;
} finally {
//
}
}
});
}
这与下面的代码片段有什么区别?如果我理解正确,sameThreadExecutor使用调用submit()的相同线程,这意味着所有这些10&#34;作业&#34;在主线程上逐个运行。
for (int i = 0; i < 10; i++) {
try {
Do some work here...
} catch (final Exception e) {
throw e;
} finally {
//
}
}
谢谢!
答案 0 :(得分:6)
首先,不推荐使用MoreExecutors#sameThreadExecutor
:
已弃用。如果您只需要
directExecutor()
,请使用Executor
,如果您需要newDirectExecutorService()
则ListeningExecutorService
。 此方法将于2016年8月删除。
所以问题是:您何时需要MoreExecutors#directExecutor
或MoreExecutors#newDirectExecutorService
(上面提到的两者之间的差异 - ListeningExecutorService
是ListenableFuture
的番石榴扩展名)。答案是:
Executor
/ ExecutorService
时使用它(例如,您的界面需要它)并且不想要并发,而是同步运行多线程代码ExecutorService
之类的简单newDirectExecutorService
时,但又不想重新发明轮子(请参阅its source code)ListenableFuture##addCallback(ListenableFuture, FutureCallback)
,默认情况下会使用newDirectExecutorService
("for use when the callback is fast and lightweight",也会在某些情况下提及它&#34;这是一个危险的选择&# 34;(见javadoc))。