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

jun*_*per 11 java java-ee primefaces cancellation

我有一个按钮从调用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>
Run Code Online (Sandbox Code Playgroud)

这是我的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");    
 }
Run Code Online (Sandbox Code Playgroud)

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

Tan*_*til 12

具有中断友好任务的ExecutorService

ExecutorService 文件


  • 而不是直接调用方法,将方法转换为一个ExecutorService任务.

    public class SearchEmailsTask implements Runnable {
    
        private EmailSearcher emailSearcher;
    
        public SearchEmailsTask(EmailSearcher emailSearcher) {
            this.emailSearcher = emailSearcher;
        }
    
        @Override
        public void run() {
            emailSearcher.searchEmails();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    Callable<Object>如果你想要退货,你可以使用.


  • 如果要调用方法,请将该任务提交给ExecutorService.

    ExecutorService executorService = Executors.newFixedThreadPool(4);
    
    SearchEmailsTask searchEmailsTask = new SearchEmailsTask(new EmailSearcher());
    
    Future<?> future = executorService.submit(searchEmailsTask);
    
    Run Code Online (Sandbox Code Playgroud)

  • 保留对任务的引用.

    private static Map <String, Future<Object>> results = new HashMap <String, Future<Object>>();
    
    Run Code Online (Sandbox Code Playgroud)

    存储多个Future对象的地图应该是一个好主意.如果你愿意,你当然可以选择更好的东西.



注意:
任务应该有适当的线程中断检查以正确取消.
要实现此目的,请参阅

  1. ExecutorService的未来任务并未真正取消
  2. 如何使用线程的id挂起线程?

祝好运.