查询 Java Future 和 RejectionHandler

Queries on Java Future and RejectionHandler

我对 Future 的使用有一些疑问。在解决我的问题之前,请先看下面的例子。

http://javarevisited.blogspot.in/2015/01/how-to-use-future-and-futuretask-in-Java.html

  1. 使用线程池的主要目的&Executors是在不阻塞主线程的情况下异步执行任务。但是一旦你使用 Future,它就会阻塞调用线程。我们是否必须创建单独的新 thread/thread 池来分析 Callable 任务的结果?或者还有其他好的解决方案吗?
  2. 由于 Future 来电阻塞了来电者,是否值得使用此功能?如果我想分析一个任务的结果,我可以有同步调用并在没有Future.
  3. 的情况下检查调用结果
  4. 使用 RejectionHandler 处理被拒绝任务的最佳方法是什么?如果一个任务被拒绝,将任务提交到另一个线程或线程池或者再次将相同的任务提交到当前 ThreadPoolExecutor 是一种很好的做法吗?

如果我对这个功能的思考过程有误,请纠正我。

您的问题是关于在完成异步操作后执行操作。另一方面,如果您有一个不相关的 activity,您可以在异步操作为 运行 时执行,Futures 是好的。然后,您可以通过 isDone() 定期轮询 Future 表示的操作,如果没有则执行其他操作,或者如果当前线程没有更多不相关的工作,则调用阻塞 get()

如果您想在不阻塞当前线程的情况下安排完成操作,您可以改用 CompletableFuture,它提供了此类功能。

CompletableFuture 是@Holger

建议的查询 1 和 2 的解决方案

我想更新有关查询 3 的 RejectedExecutionHandler 机制。

Java 根据 javadocs.

提供四种类型的拒绝处理程序策略
  1. 在默认 ThreadPoolExecutor.AbortPolicy 中,处理程序在拒绝时抛出运行时 RejectedExecutionException

  2. ThreadPoolExecutor.CallerRunsPolicy中,调用execute的线程自己运行任务。这提供了一种简单的反馈控制机制,可以减慢提交新任务的速度。

  3. ThreadPoolExecutor.DiscardPolicy中,一个不能执行的任务干脆丢掉

  4. ThreadPoolExecutor.DiscardOldestPolicy中,如果执行器没有关闭,则丢弃工作队列头部的任务,然后重试执行(可能会再次失败,导致这个重复。)

CallerRunsPolicy:如果任务队列中有更多任务,使用此策略会降低性能。您必须小心,因为拒绝任务将由主线程本身执行。如果 运行 被拒绝的任务对您的应用程序至关重要并且您的任务队列有限,您可以使用此策略。

DiscardPolicy:如果丢弃非关键事件不打扰您,那么您可以使用此策略。

DiscardOldestPolicy: 放弃最早的工作,尝试恢复最后的工作

如果其中 none 符合您的需要,您可以实施自己的 RejectionHandler