【问题标题】:How to terminate a thread in a view scoped bean?如何终止视图范围 bean 中的线程?
【发布时间】:2012-08-20 04:29:24
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java multithreading jsf-2


    【解决方案1】:

    作为您的用例的快速解决方案:

    调用:

    boolean cancel(boolean mayInterruptIfRunning)
    

    在你的情况下,调用应该使用:

    mayInterruptIfRunning=true
    

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

    【讨论】:

    • b .. 非常感谢您的回复。对此,我真的非常感激。我认为它成功了。我使用了一个静态布尔变量。在线程池第一次运行时,我将其设置为 true,因此在第二次请求时,我取消当前线程池并创建一个新实例。我不知道这是否是标准的做法。我已经编辑了问题中的代码。你说什么?
    • 您会遇到麻烦,因为这仅适用于一个客户端(因为您使用静态字段 - ifinterrupt)。如果您有 2 个客户的一个可以终止另一个线程。我想这不是理想的行为:) 您需要提供映射: to future
    • 哦,是的,我完全忘记了……只是为了澄清一下,保持会话中的未来有效吗? ..
    • 是的,听起来就像是一种方式:) 但这取决于保持会话对您的意义:) 如果您尝试对其进行序列化 => 那不应该工作。但是,如果可能的话,我会选择一些会话范围的 bean 并将其保留在那里。或者只是一些具有会话标识符作为键和未来作为值的静态映射(但是你需要找出会话标识符是什么:)
    • 我跟着你的方法。现在我有一个静态地图,其中 userid 作为键,future ref 作为值。非常感谢您的帮助.. 干杯:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多