熊与我同在,我不是在多线程编程非常精明......Java的线程池和可运行在创建可运行
我目前正在建设的是使用一个线程池的ExecutorService各种可运行的系统。这很简单。然而,我正在研究让runnables本身产生一个额外的runnable的可能性,这个runnable基于原始runnable中发生的事情(例如,如果成功,做到这一点,如果失败,做到这一点等等,因为有些任务必须先于其他任务完成执行)。应该注意的是,主线程不需要被通知这些任务的结果,尽管它可能对于处理异常很方便,即如果不能联系外部服务并且所有线程都因此抛出异常,则停止提交任务并定期检查外部服务,直到恢复。这并非完全必要,但它会很好。
即,提交任务A.任务A做一些事情。如果一切顺利,任务A将执行任务B.如果某些事情不能正常工作或引发异常,请执行任务C.每个子任务也可能有其他任务,但只有几个级别深。我宁愿在一个任务中做这样的事情,而不是大型的,咆哮的条件,因为这种方法允许更大的灵活性。
但是,我不确定这将如何影响线程池。我假设从池中的一个线程内创建的任何附加线程都将存在池外,因为它们本身并未直接提交到池中。这是一个正确的假设吗?如果是这样,这可能是一个坏主意(好吧,如果不是,它可能不是一个好主意),因为它可能会导致更多的线程,因为原来的线程完成,并提交一个新的任务,而线程从先前的任务仍然在进行(并且可能会持续比其他任务长得多)。
我也考虑过将这些实现为Callables,并在返回的Future中放置响应对象,然后根据响应将相应的Callable添加到线程池中。但是,这会将所有操作都绑定到主线程,这似乎是不必要的瓶颈。我想我可以将一个Runnable放入池中,该池本身处理Callable和后续动作的执行,但是然后我得到两倍的线程数。
我在这里的正确轨道上,还是我完全脱轨?
漂亮漂亮,但不是我想要的。将工作量分成更小的块并不是真正需要的,但从某种意义上来说,更多的是在一个池中进行条件任务链的模式。 – user1017413