请耐心等待,因为我在多线程编程方面并不是很精通......
我目前正在构建一个将 ThreadPool ExecutorService 用于各种可运行的系统。这很简单。但是,我正在考虑让可运行文件本身根据原始可运行文件中发生的情况产生额外的可运行文件的可能性(即,如果成功,则执行此操作,如果失败,则执行此操作等,因为某些任务必须在其他任务之前完成执行)。需要注意的是,不需要将这些任务的结果通知主线程,尽管它对于处理异常可能很方便,即,如果无法联系到外部服务并且所有线程都因此抛出异常,那么停止提交任务并定期检查外部服务,直到它恢复。这不是完全必要的,但它会很好。
即,提交任务A。任务A 做了一些事情。如果一切顺利,任务 A 将执行任务 B。如果某些事情不正常或抛出异常,则执行任务 C。每个子任务也可能有额外的任务,但只有几个层次。我宁愿在单个任务中做这样的事情,也不愿在单个任务中使用大而复杂的条件,因为这种方法可以提供更大的灵活性。
但是,我不确定这将如何影响线程池。我会假设从池中的线程内创建的任何其他线程都将存在于池之外,因为它们本身并未直接提交到池中。这是一个正确的假设吗?如果是这样,这可能是一个坏主意(好吧,如果不是,它可能无论如何都不是一个好主意),因为它可能会在原始线程完成时导致更多线程,并且在线程从较早的任务仍在进行(并且可能比其他任务持续时间更长)。
我还考虑将这些实现为 Callables,并将一个响应对象放在返回的 Future 中,然后根据响应将适当的 Callable 添加到线程池中。但是,这会将所有操作绑定到主线程,这似乎是一个不必要的瓶颈。我想我可以将一个 Runnable 放入池中,该池本身处理 Callable 和后续操作的执行,但是我得到的线程数是原来的两倍。
我是在正确的轨道上还是我完全偏离了轨道?