gpt4 book ai didi

java - 如何使用停止按钮停止运行 Java 代码

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:52 26 4
gpt4 key购买 nike

我有一个从支持 Bean 调用方法的按钮。此方法允许从解析 html 代码中提取数据。当该方法运行时,我有一个显示进度条和命令按钮 Cancel 的对话框。我需要当用户单击取消按钮时,提取按钮调用的方法停止。

这是我的 html 代码:

<p:commandButton
value="Start" style="width: 12%;height: 100%"
update=":confirmPurchase, :confirmPurchaseTest, :mainform" id="extractbutton"
ajax="true" widgetVar="ButtonExtract"
actionListener="#{mailMB.searchEmails()}"
icon="ui-icon-disk" styleClass="ui-priority-primary"
onstart="blockUIWidget1.show();" oncomplete=" blockUIWidget1.hide();" />

<p:dialog widgetVar="blockUIWidget1" header="Hitonclick" modal="true"
resizable="false" closable="false">
<table border="0" style="width: 500px">
<tbody >
<tr>
<td>
<p:graphicImage url="pictures/loading81.gif" width="200" height="200" alt="animated-loading-bar"/>
</td>
<td>
<h:outputLabel value="Extracting is in progress. Please wait..."/>
<div align="center">
<p:commandButton value="Cancel" title="Cancel" />
</div>
</td>
</tr>
<div align="right">

</div>
</tbody>
</table>
</p:dialog>

这是我的 sessionScoped Bean 中的 searchEmails 方法

 public void searchEmails() throws Exception {
idCustomer = (String) session.getAttribute("idCustomer");
System.out.println(idCustomer + " this is it");
Customer customer = customerBusinessLocal.findById(idCustomer);
data = dataBusinessLocal.createData(new Date(), number, keyword, moteur, customer, State.REJECTED);
mails = mailBusinessLocal.createEmails(keyword, number, moteur, data);
System.out.println("Method was invoked");
}

如何通过取消命令按钮停止运行 searchEmails 方法?

最佳答案

具有中断友好任务的ExecutorService

ExecutorService documentation


  • 不是直接调用方法,而是将方法转换为 ExecutorService的任务。

    public class SearchEmailsTask implements Runnable {

    private EmailSearcher emailSearcher;

    public SearchEmailsTask(EmailSearcher emailSearcher) {
    this.emailSearcher = emailSearcher;
    }

    @Override
    public void run() {
    emailSearcher.searchEmails();
    }
    }

    您可以使用 Callable<Object>如果您想返回。


  • 当您想调用该方法时,将该任务提交给 ExecutorService .

    ExecutorService executorService = Executors.newFixedThreadPool(4);

    SearchEmailsTask searchEmailsTask = new SearchEmailsTask(new EmailSearcher());

    Future<?> future = executorService.submit(searchEmailsTask);

  • 保留对任务的引用。

    private static Map <String, Future<Object>> results = new HashMap <String, Future<Object>>();

    map 应该是存储多个 Future 的好主意对象。如果你愿意,你当然可以追求更好的东西。


  • 在需要时调用任务的取消。

    future.cancel(true);

注意:
任务应该对线程中断进行适当的检查以正确取消。
要实现这一点,请参阅

  1. Future task of ExecutorService not truly cancelling
  2. how to suspend thread using thread's id?

祝你好运。

关于java - 如何使用停止按钮停止运行 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22166832/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com