后台处理 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 文档 Thread
、Runnable
和 java.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
如果这是一个基本问题,请原谅我的无知。
我想了解如何 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 文档 Thread
、Runnable
和 java.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