异步与新线程-解决方案需要帮助(Java)

异步与新线程-解决方案需要帮助(Java),java,jakarta-ee,ejb-3.1,Java,Jakarta Ee,Ejb 3.1,我有一个方法,目前需要返回一个结果到客户端不慢于目前。所以它必须调用一个方法并忘记它,它应该继续处理,而不是等待该方法返回任何结果。 我一直在玩ejb@Asynchronous注释,还使用了新线程。我发现: 方法1:使用@Asynchronous-调用此方法时,调用方似乎在等待。这个方法返回void,所以我认为调用方会调用它并继续,但事实并非如此。 呼叫方代码: public static void main(String[] args) { System.out.println("Ca

我有一个方法,目前需要返回一个结果到客户端不慢于目前。所以它必须调用一个方法并忘记它,它应该继续处理,而不是等待该方法返回任何结果。 我一直在玩ejb@Asynchronous注释,还使用了新线程。我发现:

方法1:使用@Asynchronous-调用此方法时,调用方似乎在等待。这个方法返回void,所以我认为调用方会调用它并继续,但事实并非如此。 呼叫方代码:

public static void main(String[] args) {
    System.out.println("Caller Starting");
    Processor p = new Processor();
    p.doSomeStuff();
    System.out.println("Caller Ended");
}

public class Processor{
@Asynchronous
public void doSomeStuff() {
    System.out.println("Async start");
    for(int i = 0; i < 50; i++) {
        System.out.println("Async: " +i);
    }
    System.out.println("Async ended");
}
公共类处理器扩展线程{

public void doSomeStuff() {
    start();        
}

@Override
public void run() {

    // Loop for ten iterations.

    for(int i=0; i<10; i++) {
        System.out.println(i + " looping ...");

        // Sleep for a while
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            // Interrupted exception will occur if
            // the Worker object's interrupt() method
            // is called. interrupt() is inherited
            // from the Thread class.
            break;
        }
    }
}
public void doSomeStuff(){
start();
}
@凌驾
公开募捐{
//循环十次迭代。

对于(int i=0;i使用@Asynchronous注释与创建新线程时做的事情相同,但麻烦较少。在您的情况下,您使用的注释不正确。 异步方法必须位于无状态bean中,才能在调用方方法不等待的情况下运行。 所以也许这应该行得通

@Stateless
public class Processor{
@Asynchronous
public void doSomeStuff() {
    System.out.println("Async start");
    for(int i = 0; i < 50; i++) {
        System.out.println("Async: " +i);
    }
    System.out.println("Async ended");
}
@无状态
公共类处理器{
@异步的
公共空间doSomeStuff(){
System.out.println(“异步启动”);
对于(int i=0;i<50;i++){
System.out.println(“异步:+i”);
}
System.out.println(“异步结束”);
}

谢谢,让我来准备添加@Stateless注释,虽然我很确定我是以这种方式开始的,但我会再次尝试。我也在尝试CompleteableFuture,特别是使用runAsync方法。我认为它也可以这样做,但代码/管道更少。
@Stateless
public class Processor{
@Asynchronous
public void doSomeStuff() {
    System.out.println("Async start");
    for(int i = 0; i < 50; i++) {
        System.out.println("Async: " +i);
    }
    System.out.println("Async ended");
}