Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何终止视图范围bean中的线程?_Java_Multithreading_Jsf 2 - Fatal编程技术网

Java 如何终止视图范围bean中的线程?

Java 如何终止视图范围bean中的线程?,java,multithreading,jsf-2,Java,Multithreading,Jsf 2,在我们的应用程序中,当用户单击commandlink时,会生成一个弹出窗口。此单击将向进程传递一个id 我的托管bean是ViewScope的,我正在创建一个线程来执行一些任务 在用户单击链接的场景中,会生成一个弹出窗口,线程已经开始执行作业,比如说用户关闭弹出窗口,并尝试单击提供不同id的链接。我的问题是之前启动的线程没有被销毁。我仍然可以得到最新的id详细信息作为响应,但是前面的线程仍然执行作业 我想知道是否有一种方法可以在新请求上终止前一个实例线程。我知道我可以使用sessionscope

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

我的托管bean是ViewScope的,我正在创建一个线程来执行一些任务

在用户单击链接的场景中,会生成一个弹出窗口,线程已经开始执行作业,比如说用户关闭弹出窗口,并尝试单击提供不同id的链接。我的问题是之前启动的线程没有被销毁。我仍然可以得到最新的id详细信息作为响应,但是前面的线程仍然执行作业


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

这是一个适用于您的用例的快速解决方案:

  • 我会使用threadpool,而不是为每个请求创建新线程(因为线程池的思想更有效,并且在标准API中提供)
  • 然后,您可以轻松停止池中任何正在运行的线程,我在上找到的解决方案是: =>问题包含线程池实现的示例,第一个答案为您提供了解决方案
电话:

boolean cancel(boolean mayInterruptIfRunning)
在您的情况下,呼叫应使用:

mayInterruptIfRunning=true
剩下的唯一问题是:未来的参考文献保存在哪里?:)

如果您愿意,我们也可以讨论:)

b。。非常感谢您的回复。我真的很感激。我想它成功了。我使用了一个静态布尔变量。第一次运行线程池时,我将其设置为true,因此在第二次请求时,我取消当前线程池并创建一个新实例。我不知道这是否是做这件事的标准方式。我已经编辑了问题中的代码。你说什么?你会遇到麻烦,因为这只适用于一个客户机(因为你使用静态字段-ifinterrupt)。如果您有两个客户端,一个可以终止另一个线程。我想这不是你想要的行为:)相反,你需要提供映射:到未来哦,是的,我完全忘记了…只是为了澄清一下,在会议中保持未来会起作用吗。。是的,听起来像是一种方式:)但这取决于保留在会话中对您来说意味着什么:)如果您尝试序列化它=>则不应该起作用。不过,如果可能的话,我会选择一些会话范围的bean,并将其保留在那里。或者只是一些静态映射,其中会话标识符作为键,Future作为值(但是您需要找出会话标识符是什么:)B我遵循了您的方法。现在我有一个静态映射,userid作为键,future ref作为值。非常感谢你的帮助。。干杯:)