gpt4 book ai didi

java - 如何通过返回 Future 取消异步触发的线程?

转载 作者:行者123 更新时间:2023-11-30 07:13:13 24 4
gpt4 key购买 nike

我花了数小时研究我的问题,但我找到了解决方案。

我用@Asynchronous 注释触发一个线程并返回一个 Future 对象,到目前为止一切顺利。但是,如果我试图取消 future ,似乎该命令不会取消任何东西。

JSF 文件

    <?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<h:commandButton actionListener="#{threadHandler.start()}" value="start"/>
<h:commandButton actionListener="#{threadHandler.stop()}" value="stop"/>
</h:form>
</h:body>
</html>

Java 处理程序

    /*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.jsf.example;

import java.util.concurrent.Future;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.inject.Named;

@Named("threadHandler")
@Stateless
public class Handler {

Future future;
@Inject
MethodPool pool;

public void start(){
System.out.println("start thread");
future = pool.run();
System.out.println("finish thread start");
}

public void stop(){
System.out.println("future.cancel " + future.cancel(true));
}
}

Java线程

 /*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.jsf.example;

import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.AsyncResult;
import javax.ejb.Asynchronous;
import javax.ejb.Stateless;


@Stateless
public class MethodPool {

@Asynchronous
public Future run(){
System.out.println("start run");
Integer runCondition = 1;
while(runCondition > 0){
try {
// simulate heavy stuff
Thread.sleep(1000);
System.out.println(". ");
} catch (InterruptedException ex) {
Logger.getLogger(MethodPool.class.getName()).log(Level.SEVERE, null, ex);
}

}
return new AsyncResult("finish run");
}

}

*编辑:THX @bkail *

我会为下一个绝望的人发布工作代码示例;)

@Resource
private SessionContext sessionContext;

@Asynchronous
public Future run(){
System.out.println("start run");
while(sessionContext.wasCancelCalled() == false){
try {
// simulate heavy stuff
Thread.sleep(1000);
System.out.println(". ");
} catch (InterruptedException ex) {
Logger.getLogger(MethodPool.class.getName()).log(Level.SEVERE, null, ex);
}

}
return new AsyncResult("finish run");
}

最佳答案

EJB 使用协作取消,因此传递 cancel(interrupt=true) 并不会实际中断。相反,它在方法调用上设置了一个标志。在您的 EJB 中,使用 @Resource SessionContext context;,然后检查 context.wasCancelCalled() 以检查是否调用了 cancel(interrupt=true)。

关于java - 如何通过返回 Future 取消异步触发的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19653975/

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