6

在我们的应用程序中,当用户单击 commandlink 时,会生成一个弹出窗口。此单击将传递一个 id 进行处理。

我的托管 bean 是视图范围的,我正在创建一个线程来执行一些任务。

在用户单击链接的情况下,会生成一个弹出窗口并且线程已开始执行作业,假设用户关闭弹出窗口并尝试单击这次提供不同 ID 的链接。我的问题是之前启动的线程没有被破坏。我仍然可以获得最新的 id 详细信息作为响应,但前一个线程仍然执行作业。

我想知道是否有办法在新请求上终止前一个实例线程。我知道我可以使用 sessionscoped 来实现这一点,但弹出窗口是在同一个会话中打开的。

4

1 回答 1

1

就像您的用例可能的快速解决方案一样:

  • 我会使用线程池而不是为每个请求创建新线程(因为线程池的想法更有效+在标准 API 中提供)
  • 那么您可以轻松地停止池中任何正在运行的线程,我在以下网址找到了解决方案:http: //www.coderanch.com/t/234197/threads/java/stopping-runnable-ThreadPoolExecutor => 问题包含线程池实现的示例和第一个答案为您提供解决方案

调用:

boolean cancel(boolean mayInterruptIfRunning)

在您的情况下,呼叫应使用:

mayInterruptIfRunning=true

剩下的唯一问题是:在哪里保留 Future 参考?:)
如果您愿意,我们也可以讨论 :)

于 2012-08-25T10:51:07.950 回答