Java 线程池和创建可运行对象的可运行对象

标签 java multithreading threadpool runnable callable

请耐心听我说,因为我对多线程编程不是很了解......

我目前正在构建一个系统,该系统使用 ThreadPool ExecutorService 来执行各种可运行的任务。这很简单。但是,我正在研究让可运行对象本身根据原始可运行对象中发生的情况生成额外可运行对象的可能性(即,如果成功,则执行此操作,如果失败,则执行此操作等,因为某些任务必须在其他任务之前完成)执行)。应该注意的是,主线程不需要被通知这些任务的结果,尽管它对于处理异常可能很方便,即,如果无法联系外部服务并且所有线程都抛出异常,那么停止提交任务并定期检查外部服务,直到其恢复。这并不是完全必要的,但那就太好了。

即,提交任务A。任务A做了一些事情。如果一切顺利,任务 A 将执行任务 B。如果出现问题或抛出异常,则执行任务 C。每个子任务还可能有其他任务,但只有几个级别深。我宁愿做这样的事情,也不愿在单个任务中使用大而困惑的条件,因为这种方法可以提供更大的灵 active 。

但是,我不确定这会如何影响线程池。我假设从池中的线程内创建的任何其他线程都将存在于池之外,因为它们本身没有直接提交到池中。这是一个正确的假设吗?如果是这样,这可能是一个坏主意(好吧,如果不是,这可能不是一个好主意),因为当原始线程完成时,它可能会导致更多的线程,并且在从线程生成的同时提交一个新任务。较早的任务仍在继续(并且可能比其他任务持续更长的时间)。

我还考虑过将它们实现为 Callable,并将响应对象放置在返回的 Future 中,然后根据响应将适当的 Callable 添加到线程池中。然而,这会将所有操作绑定(bind)回主线程,这似乎是一个不必要的瓶颈。我想我可以将一个 Runnable 放入池中,该池本身处理 Callable 和后续操作的执行,但随后我得到的线程数量是原来的两倍。

我是走在正确的轨道上还是完全偏离了轨道?

最佳答案

我从未使用过这个,但它对你可能有用:http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

关于Java 线程池和创建可运行对象的可运行对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18087452/

相关文章:

c# - StackExchange.Redis.RedisTimeoutException : Timeout awaiting response

java - Map/Reduce wall-time 对 Reduce 任务的数量不敏感

java - 为什么即使提供了初始容量,我们也不能在将元素添加到第 (n-1) 个索引之前将元素添加到列表中的第 n 个索引

java - 数学表达式解析器

java - soap:address 位置属性 - 最佳实践

python - 为什么Python3守护线程在控制台中立即关闭?

java - ExecutorService FixThreadPool 作为共享参数不并行运行

java - 具有 SupplyAsync 的 CompletableFuture 未按预期工作

java - 致命异常 : AsyncTask #1 when trying to access remote database from mobile android app

scala - 没有单独线程的同步 Scala Future