我正在使用Executor
具体框架Executors.newCachedThreadPool();
我有一个清单Runnable
例如100.
前 50 个每个创建一个值(存储在列表中)以供后 50 个使用。
我想如果我通过了Runnable
是在executor.execute()
按照它们在列表中的顺序,它们将是
也按照同样的顺序执行。
但这并没有发生。
这些任务似乎是按随机顺序执行的,并且它们是交错执行的,而不是按顺序执行的。
这是它应该如何工作的吗?有办法解决这个问题吗?
Thanks
您需要分两批提交作业,或者以其他方式创建明确的“发生之前”关系。建议构建两批作业并使用invokeAll(batch1); invokeAll(batch2);
The invokeAll()
方法将执行所有任务并阻塞直到它们完成。您可能需要包裹您的Runnable
s as Callable
s,你可以用它来做Executors.callable(Runnable r)
。 (@Cameron Skinner 击败了我,让我获得了一些代码示例,请参阅该答案以了解更多信息...)
执行器的全部目的是抽象执行的细节,因此除非明确说明,否则不能保证顺序。如果您想要严格顺序执行,请在您正在运行的线程中执行(最简单),在单线程执行器中执行,alaExecutors.newSingleThreadExecutor()
,或显式同步任务。如果您想执行后者,您可以使用屏障或锁存器,并将相关任务块放在屏障/锁存器上。您还可以实现第一个任务块Callable
, 返回Future
,并让相关任务调用myFuture.get()
这将导致它们阻塞,直到返回结果。
如果您详细说明您的具体应用,我们也许能够提供更具体的帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)