如何使用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

我想从java函数异步调用一个存储过程,这意味着我的函数不应该等待该存储过程是否执行。它应该只调用该存储过程,而不应该等待执行。我试过线程,有没有其他异步执行存储过程的方法

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);