如何在异步线程中执行后台计算(在 REST Web 服务中)
How to execute background computations in an asynchronous thread(In a REST Web service)
我有一个满足 HTTP 请求的 REST Web 服务。从数据库中获取数据后,我想 运行 一个后台线程并开始分析数据,这需要一些额外的时间才能完成。此数据与响应无关,我们只是记录计算分析。
我根据自己对线程概念的理解尝试了以下方法。但是在这两种情况下,HTTP 响应都是在后台计算完成后立即返回的,所以基本上计算线程和原始线程不是异步的,计算线程会停止响应线程,直到分析完成。
启动了一个守护线程。 我希望守护线程在后台 运行 同时 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);
我有一个满足 HTTP 请求的 REST Web 服务。从数据库中获取数据后,我想 运行 一个后台线程并开始分析数据,这需要一些额外的时间才能完成。此数据与响应无关,我们只是记录计算分析。
我根据自己对线程概念的理解尝试了以下方法。但是在这两种情况下,HTTP 响应都是在后台计算完成后立即返回的,所以基本上计算线程和原始线程不是异步的,计算线程会停止响应线程,直到分析完成。
启动了一个守护线程。 我希望守护线程在后台 运行 同时 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);