public static CompletableFuture<Void> runAsync(Runnable runnable,
Executor executor)
返回一个新的completablefuture,该Future由在给定执行器中运行的任务在运行给定操作后异步完成。
public static ExecutorService newSingleThreadExecutor()
任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态
我想使用completablefuture来避免使用blocking.get()方法,但我不确定completablefuture是否可以做到这一点:
任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态
通过传递它 newSingleThreadExecutor()
. i、 e可以在将来使用executorservice的submit()方法来完成,如果没有的话,上面的行为仍然可以保证,因为我们将它传递给只使用一个线程的executor。
为了进一步澄清这个问题:
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
通过 newSingleThreadExecutor()
即使只调用execute()方法,这是否仍会导致将任务放入 LinkedBlockingQueue
或者该任务将从另一个线程执行?
为什么我需要这个:
我正在写一个文件,这个写应该是异步执行的,但是如果写任务已经在运行,那么就不应该开始另一次写尝试,也不应该在文件被写的时候读取它。
所以如果有人调用一个方法 readThisObjectFromFile(filename);
它应该返回completablefuture对象(这里我必须使用 supplyAsync
方法),以便他们可以进一步 thenApply
而不是使用 .get()
方法,从而阻塞主线程。
暂无答案!
目前还没有任何答案,快来回答吧!