我使用Managed Executor Service来实现处理后台任务的服务。应该允许该服务停止正在运行的任务并终止工作线程并将其返回到线程池以进行下一个任务。一旦它被停止,你能从你离开的地方恢复吗?
答案 0 :(得分:2)
不可以,在Java EE环境中无法关闭,终止或恢复ManagedExecutorService。
根据Java EE Concurrency Utilities 1.0规范,子弹#2
3.1.6.1 Java EE产品提供商要求
本小节介绍ManagedExecutorService的其他要求 提供者。
- 从ManagedExecutorService执行时,所有任务都将使用组件的Java EE组件标识运行 提交了任务。
- ManagedExecutorService的生命周期由应用程序服务器管理。所有生命周期操作都在 ManagedExecutorService接口会抛出一个 java.lang.IllegalStateException异常。这包括以下内容 java.util.concurrent.ExecutorService中定义的方法 interface:awaitTermination(),isShutdown(),isTerminated(), shutdown()和shutdownNow()。
- 如果未启动任务的组件,则不能运行提交给执行程序的任务。
醇>Java正在关闭ManagedExecutorService实例时 EE产品提供商:
- 拒绝所有提交新任务的尝试。
- 如果未运行,则会取消所有提交的任务。
- 所有正在运行的任务线程都被中断。
- 调用所有已注册的ManagedTaskListeners。
醇>
这似乎是一个限制,但之所以存在此限制,是因为ManagedExeuctorService由Java EE产品提供商为您管理。
所以不要担心在Java EE中启动,停止或恢复ManagedExeuctorService。
现在,如果您想等到所有任务完成,那么这是一个非常合理的要求。这可以通过多种方式实现:
ExecutorService.invokeAll(java.util.Collection)
并跟踪列表>你回来了。ExecutorService.submit(Callable)
或ExecutorService.submit(Runnable)
提交任务后,您需要以您选择的任何方式管理Future<T>
的集合,并使用get()
(屏蔽)或isDone()
(非阻塞)检查它们是否已完成。