在我的应用程序中,作业将被动态提交,我需要跟踪提交作业的完成情况。当我关闭我的应用程序时,我想等到所有提交的作业完成。为此,我维护了一个提交的作业 ID 列表。一旦提出流程完成通知,我就会从列表中删除 id。当调用关闭时,我正在等待列表变为空。
while (!ids.isEmpty());
有没有更好的方法来解决这个忙碌的等待。
在我的应用程序中,作业将被动态提交,我需要跟踪提交作业的完成情况。当我关闭我的应用程序时,我想等到所有提交的作业完成。为此,我维护了一个提交的作业 ID 列表。一旦提出流程完成通知,我就会从列表中删除 id。当调用关闭时,我正在等待列表变为空。
while (!ids.isEmpty());
有没有更好的方法来解决这个忙碌的等待。
如果您通过创建和启动线程来手动实现作业调度和运行,那么您需要使用Object.wait
和Object.notify
实现条件变量。做对了有点繁琐...
但更好的方法是使用ThreadPoolExecutor
服务来运行您的作业。这允许您提交所有作业,然后调用shutdown
and awaitTermination
... ,这将等待所有排队的作业完成。
你在重新发明一个ExecutorService
吗?特别是它的awaitTermination()
方法?是的,awaitTermination()
不忙等待......
您可以尝试反过来做:每个作业都调用一个“退出”方法(在保存 id 的类中)检查这是否是最后一个死去的进程。这样就不会出现忙等待循环。为每个作业提供具有退出方法的“TerminationHandlerInterface”。