后台处理 java

Background processing java

如果这是一个基本问题,请原谅我的无知。

我想了解如何 return 从模块控制并在后台开始处理?

让组件 A 开始调用组件 B。组件 B 进行一些基本处理,启动后台线程并立即 return 将控制权交给 A。每当后台线程完成其处理时,它将把结果存储在持久性存储。此后台线程的整个处理过程非常耗时,A 不能等到后台线程结束。

Component A {
  Http Call component B
}

Component B {
  // Got request from component A
  start background thread();
  return; // don't wait till background thread finishes off
}

background thread() {
 // time consuming task
}

如何在 java 中实现此行为?我不认为它是完全异步的处理形式,因为通信是通过具有超时设置的 http 连接进行的。

更新:

 Component A:
 Receives Http call 


 Component B:

 Approach1:

 Runnable runnable = new MyThread();
 new Thread(runnable).start();

 Approach2:

 ExecutorService exec = Executors.newSingleThreadExecutor();
 exec.execute(new MyThread());
 exec.shutdown();

上述两种方法都帮助我开始后台处理并return立即控制 A。

假设您希望在后台处理完成之前对 return 进行 HTTP 调用,您的伪代码对于 Java.

完全有效

在下一级别的详细信息中,查看 Java 文档 ThreadRunnablejava.nio 库 类。

最简单的方法可能是创建一个新的 java Thread 并将后台处理逻辑作为参数。

void componentB() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            // Time consuming task.
        }
    }).start();
    // The method continues without stopping.
}

在java以后的版本中,也可以使用ForkJoinPool-class来实现:

public class Main {

    private final ExecutorService executor = new ForkJoinPool();

    void componentA() {
        componentB();
    }

    void componentB() {
        executor.execute(this::timeConsumingTask);
        // The method continues without stopping.
    }

    private void timeConsumingTask() {
        // Time consuming task.
    }
}

在原始级别使用线程是一些简单的概念证明的好解决方案,但我强烈建议至少尝试使用 java 中的并发 API,您可以找到文档 here. and a good tutorial is here

最简单的方法是创建一个 Callable 对象,其中包含您要在后台执行的指令。

Callable myInstructions = new Callable<ObjectToReturn>() {
         public ObjectToReturncall() {
           return object.methodCall();
       }}

使用 ExecutorService 提交此可调用对象以期待 Future 对象。

Future<ObjectToReturn> future = executor.submit(myInstructions);
//Do anything else as this wont be blocked ..

未来API有一套方法来询问任务是否已经完成。

if(future.isDone()) // Ask if the task is done
    ObjectToReturn solution = future.get()   // Get the result

使用 Future 非常简单 API .

编辑

如果您不期望 Future 有任何响应api,只需执行您可以使用的操作

Future<Void> future = executor.submit(new Callable<Void>() {
    public Void call() throws Exception {
        testA.abc();
        return null;
    }
});

如果您不想收到结果或得到响应,则可以选择其他选项,只需启动一个线程即可

ExecutorService executor = Executors.newFixedThreadPool(5);`
executor.execute(new RunnableClass());

同时避免在 ExecutorService 上调用 shutdown ,直到进程结束时才这样做,当你没有更多时间做时,在 spring 或容器 fwks 中由容器负责关闭应用后 ExecutorService