如何使用JAVA异步执行存储过程
我想从java函数异步调用一个存储过程,这意味着我的函数不应该等待该存储过程是否执行。它应该只调用该存储过程,而不应该等待执行。我试过线程,有没有其他异步执行存储过程的方法如何使用JAVA异步执行存储过程,java,oracle,asynchronous,stored-procedures,Java,Oracle,Asynchronous,Stored Procedures,我想从java函数异步调用一个存储过程,这意味着我的函数不应该等待该存储过程是否执行。它应该只调用该存储过程,而不应该等待执行。我试过线程,有没有其他异步执行存储过程的方法 public void callLogonDetailSP(UserDetails userInfoSharedObject) { new Thread(() -> { int i = logonUserDetailsRepository.callLogonDetailSP(us
public void callLogonDetailSP(UserDetails userInfoSharedObject) {
new Thread(() -> {
int i = logonUserDetailsRepository.callLogonDetailSP(userInfoSharedObject.userName, userInfoSharedObject.password, userInfoSharedObject.userCityName);
}).start();
}
线程
对象的更高级替代品是Executor服务。更多信息请点击此处:
这些可以使用Executors
类的静态方法创建。一些类似的newSingleThreadExecutor()
管理1个线程,但如果需要更多线程,您可以使用newFixedThreadPool(int n)
,它将创建一个管理n
线程的执行器服务
这些类还使用一个Future
对象,该对象表示任务的结果(结果尚未计算,但无论如何都会得到对它的引用,因此得名)
ExecutorService executor=Executors.newSingleThreadExecutor();
可调用c=新的可调用(){
@重写公共整数调用(){
return 0;//在此处执行一些返回整数的任务
}
};
未来=执行人提交(c);
请注意,Callable
和Future
都是泛型的,因此您可以使用任何类作为后台任务的结果
对于ANDROID:
如果你为android开发,你也可以使用AsyncTask
。非常有用,因为通常只能从UI线程修改android UI元素,但此类提供了在任务完成后在UI线程上运行的方法
这几乎就是您所需要的,但是您可能会遇到一些性能问题,这取决于您最终生成的线程数量。您应该使用线程池来限制应用程序生成的最大线程数,但仍然允许您异步安排工作。我建议将所有这些作业添加到队列中,并像flakes所说的那样限制最大线程数。使用队列存储作业,这样当线程达到最大限制时,在任何线程空闲时仍然可以执行作业。如果调用有问题怎么办?你会忽略它吗?
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Integer> c = new Callable<>() {
@Override public Integer call() {
return 0; //do some task here that returns an integer
}
};
Future<Integer> future = executor.submit(c);