在java中取消阻止调用
我正在调用一个外部api来获取报告状态一旦我的报告状态完成,我就应该继续获取结果。到目前为止,我所做的只是添加了一个睡眠,但这是一个阻塞调用,报告需要大约半个小时才能完成。所以我需要一种方法来解除我接下来的步骤。有人能告诉我怎么才能做到吗在java中取消阻止调用,java,multithreading,call,blocking,Java,Multithreading,Call,Blocking,我正在调用一个外部api来获取报告状态一旦我的报告状态完成,我就应该继续获取结果。到目前为止,我所做的只是添加了一个睡眠,但这是一个阻塞调用,报告需要大约半个小时才能完成。所以我需要一种方法来解除我接下来的步骤。有人能告诉我怎么才能做到吗 String reportStatus = client.ReportStatus(jobId).getStatus(); while(reportStatus != "Completed"){ int seconds
String reportStatus = client.ReportStatus(jobId).getStatus();
while(reportStatus != "Completed"){
int seconds = 5;
System.out.println("Waiting:" + seconds);
try {
Thread.sleep(seconds*5);
}
catch(InterruptedException e){
System.out.println("Done");
}
reportStatus = client.ReportStatus(jobId).getStatus();
}
final FetchReportResult reportValues = client.fetchReport(jobId);
您应该在另一个线程中执行此操作,然后您将能够将其作为异步调用进行调用如果您正在寻找异步调用,您应该考虑在单独的线程上调用此函数。您可以通过创建一个线程池并告诉它为您执行此代码来实现这一点。然后,代码将在后台运行,直到完成为止,在这种情况下,您可以使用它做一些事情。然后,您唯一需要做的就是将其包装在一个可运行的文件中,并在最后与EventQueue同步,这样您就完成了设置 要执行的代码:
CallBackFunction aFunction = null;
Runnable runnable = new MyRunnable(aFunction);
ExecutorService executorService = Executors.newFixedThreadPool( 1 );
executorService.execute( runnable );
CallBackFunction接口:
public interface CallBackFunction {
/**
* Function that gets called when callback is finished
*/
void callbackfinished();
}
而runnable:
public class MyRunnable implements Runnable {
private CallBackFunction fCallbackFunction;
public MyRunnable( CallBackFunction callbackFunction ) {
fCallbackFunction = callbackFunction;
}
@Override
public void run() {
//execute your polling code here//
if(complete){
EventQueue.invokeLater( new Runnable() {
@Override
public void run() {
fCallbackFunction.callbackfinished();
}
} );
}
}
}
当您执行MyRunnable对象时,它不会阻塞正在运行的线程。相反,它将在后台线程上运行。runnable将“轮询”服务器,就像您在代码中描述的那样。最后,当轮询完成时,它将调用callback函数来通知完整性发生了变化
我希望这有帮助
注意:我在eventqueue上运行callback函数。这对于您的应用程序可能是必需的,但如果您正在使用GUI,这可能会更安全。使用ExecutorService执行异步调用,因此请求由executor中的线程池完成。请检查java.util.concurrent.Executors,它包含一些线程池。然而,当应用程序退出时,何时关闭线程池以确保所有接受的请求都已完成是一个问题“Completed”是错误的,您应该使用
(!reportStatus.equals(“Completed”)
在字符串之间进行比较。您发布的代码看起来不错,您在说什么类型的取消阻止?当报告完成时,你有什么活动吗?是的。。因此,您可以假设我提交了一个查询,并等待其状态从pending->executing->complete更改。查询完成后,只有我可以从另一个API获取查询结果。而不是每次睡25秒。。我想使用线程,这样oen线程将读取状态,而另一个线程将在状态为完成时获取结果。。有什么办法可以实现吗我必须把这些状态存储在本地数据库中,并让两个线程读取值吗?我添加了一些示例代码。如果你有问题,不要犹豫。