【问题标题】:ExecutorService-like class where user controls when Callables are called类 ExecutorService 类,用户控制何时调用 Callables
【发布时间】:2012-11-06 19:43:31
【问题描述】:

我使用 ExecutorService 来安排将来要执行的任务。在看到一些“奇怪”的行为之后,我的 Callable 在我通过将 Callable 提交到 ExecutorService 池返回的 Future 对象上调用 get() 之前被执行,我阅读了一些文档,发现提交的任务将在它之间执行被提交或最迟在 Future 对象上调用 get() 时提交。

我的问题 - 是否有任何类允许将 Callables 提交给它并且仅在调用 get() 时才执行?在这一点上,似乎只是自己管理 Callables 并在我准备好执行 Callables 时自己对它们调用 call() 似乎可以完成我想要的,但我想确保已经没有服务实现了这一点。

简而言之,是否有任何替代 ExecutorService 可以让我控制何时调用提交给它的 Callables?注意 - 我希望调用它们的未来时间是可变的,并且未确定,因为我可能决定不调用它们,因此 ScheduledExecutorService 池不会在这里工作。

非常感谢!

【问题讨论】:

  • 这与同步调用call() 有何不同?线程有什么好处?
  • 不一定。我只是要求确保没有已经处理此问题的服务。鉴于下面的答案,我怀疑我应该手动执行此操作(正如您也建议的那样)是要走的路!
  • 请注意,Future.get() 是一个同步调用,它会阻塞调用线程执行并使其等待可调用对象完成,因此牺牲了可调用对象的好处(应该是异步运行的),除非您有非常特殊的要求,否则不要在代码中使用和依赖它。自动管理的任务执行是 ExecutorService 的一个特性,如果这不符合你的需求,干脆不要使用它,并在你需要的时候直接在你的代码中使用 callable.call()/runnable.run()。跨度>

标签: java android executorservice callable


【解决方案1】:

听起来您真的想改用Queue<Callable>,而只是轮询队列中的任务。

这样,您可以提交任意数量的任务并按照您的意愿执行它们 - 一项一项。

【讨论】:

  • 酷。感谢您的确认和快速响应! :)
猜你喜欢
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多