请原谅我的无知,如果这是一个基本问题。
我想了解如何从模块返回控件并在后台开始处理?
让启动组件A调用组件B.组件B ……
最简单的方法可能是创建一个新的java Thread 以后台处理逻辑为参数。
Thread
void componentB() { new Thread(new Runnable() { @Override public void run() { // Time consuming task. } }).start(); // The method continues without stopping. }
在java的更高版本中,您也可以使用 ForkJoinPool -class实现这个:
ForkJoinPool
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. } }
假设您希望在后台处理完成之前返回HTTP调用,那么您的伪代码对Java完全有效。
在下一级详细信息,请查看Javadoc Thread , Runnable ,和 java.nio 图书馆类。
Runnable
java.nio
在原始级别使用线程是一些很好的解决方案,可以轻松证明概念,但我强烈建议至少尝试使用java中的并发API,你可以找到文档 这里 。一个很好的教程是 这里
最简单的方法是创建一个Callable对象,其中包含要在后台执行的指令。
Callable myInstructions = new Callable<ObjectToReturn>() { public ObjectToReturncall() { return object.methodCall(); }}
使用 ExecutorService 提交此callable以期望Future对象。
ExecutorService
Future<ObjectToReturn> future = executor.submit(myInstructions); //Do anything else as this wont be blocked ..
Future 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的 ,直到这个过程结束,当你没有更多的时间去做,在春天或容器fwks,容器负责关闭 ExecutorService 一旦应用程序关闭