如何在异步线程中执行后台计算(在 REST Web 服务中)

How to execute background computations in an asynchronous thread(In a REST Web service)

我有一个满足 HTTP 请求的 REST Web 服务。从数据库中获取数据后,我想 运行 一个后台线程并开始分析数据,这需要一些额外的时间才能完成。此数据与响应无关,我们只是记录计算分析。

我根据自己对线程概念的理解尝试了以下方法。但是在这两种情况下,HTTP 响应都是在后台计算完成后立即返回的,所以基本上计算线程和原始线程不是异步的,计算线程会停止响应线程,直到分析完成。

  1. 启动了一个守护线程。 我希望守护线程在后台 运行 同时 HTTP 方法发送响应。但是,事实并非如此。只有在该线程中完成计算后才会显示响应。即使父线程退出,守护线程也不应该在后台 运行 吗? (请阅读 james 的评论,了解这里启动守护进程的问题)

    Callable<Boolean> computeCallable = new CallableComputeProcess();<br> 线程 t=新线程(computeCallable);<br> t.setDaemon(真);<br> t.start();

P.S:计算线程是我在父线程里面创建的子线程

有没有办法异步启动线程,让后台计算只在后台 运行 而不会停止 http 响应?

回答我自己的问题:

我使用了 FutureTask 概念和 ExecutorService,但我从未在其上调用 get() 方法。正如我们所知,focus doesn't shift to the thread(with the FutureTask) until we call FutureTask.get() method。由于我从未调用 get() 方法,后台的计算线程 运行s 同时返回 HTTP 响应。它在后台继续 运行 直到计算结束。

ExecutorService executor = Executors.newFixedThreadPool(1);

Callable<Boolean> computeCallable = new CallableComputeProcess();

executor.submit(scimCallable);

CallableComputeProcess 是这样的:

public class CallableComputeProcess implements Callable<Boolean> {
public Boolean call() {
        //do computation
        return true;
    }
}

这不是 stop/hinder 在后台执行响应和 运行 的主线程。

要获得更大的灵活性,请尝试 rxJava:

Flowable.fromCallable(() -> {
    Thread.sleep(1000); //  imitate expensive computation
    return "Done";
})
  .subscribeOn(Schedulers.io())
  .observeOn(Schedulers.single())
  .subscribe(System.out::println, Throwable::printStackTrace);

https://github.com/ReactiveX/RxJava