invokeall()与Future和CompletableFuture

时间:2015-08-11 15:09:04

标签: java multithreading concurrency

根据Oracle documentation

  

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_conversation, container, false); mainActivity = (MainActivity) getActivity(); mainActivity.setAddChatVisibility(true); return view; } :执行给定的任务,在完成所有任务后返回持有其状态和结果的Futures列表。对于返回列表的每个元素,invokeAll()都为true。请注意,已完成的任务可能正常终止或通过抛出异常终止。如果在此操作正在进行时修改了给定集合,则此方法的结果未定义。

CompletableFuture还通过以下政策实施了Future:

  
      
  • 由于(与Future.isDone()不同)此类无法直接控制导致其完成的计算,因此取消仅被视为异常完成的另一种形式。取消方法与FutureTask具有相同的效果。方法completeExceptionally(new CancellationException())可用于确定isCompletedExceptionally()是否以任何特殊方式完成。

  •   
  • 如果使用CompletableFuture完成特殊操作,则方法CompletionExceptionget()会抛出get(long, TimeUnit),其原因与相应的{{1}相同}}。为了简化大多数情况下的使用,此类还定义了方法ExecutionExceptionCompletionException,而不是直接在这些情况下抛出join()

  •   

之间有什么区别
  
      
  • getNow(T)CompletionException

  •   
  • invokeAll()

  •   

由于JDK 1.7不支持Future,使用CompletableFuture的{​​{1}}可以获得相同的结果吗?

1 个答案:

答案 0 :(得分:1)

当然,如果你写一些代码,你可以这样做:

  1. 复制/实施{所需的/相关部分)CompletableFuture。有关示例,请检查this implementation on grepcode
  2. 扩展ExecutorService(您已经使用过的),并扩展protected方法newTaskFor(),负责从Future或{Runnable实例化Callable {1}},在其中创建new CompletableFuture()