Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中取消阻止调用_Java_Multithreading_Call_Blocking - Fatal编程技术网

在java中取消阻止调用

在java中取消阻止调用,java,multithreading,call,blocking,Java,Multithreading,Call,Blocking,我正在调用一个外部api来获取报告状态一旦我的报告状态完成,我就应该继续获取结果。到目前为止,我所做的只是添加了一个睡眠,但这是一个阻塞调用,报告需要大约半个小时才能完成。所以我需要一种方法来解除我接下来的步骤。有人能告诉我怎么才能做到吗 String reportStatus = client.ReportStatus(jobId).getStatus(); while(reportStatus != "Completed"){ int seconds

我正在调用一个外部api来获取报告状态一旦我的报告状态完成,我就应该继续获取结果。到目前为止,我所做的只是添加了一个睡眠,但这是一个阻塞调用,报告需要大约半个小时才能完成。所以我需要一种方法来解除我接下来的步骤。有人能告诉我怎么才能做到吗

 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线程将读取状态,而另一个线程将在状态为完成时获取结果。。有什么办法可以实现吗我必须把这些状态存储在本地数据库中,并让两个线程读取值吗?我添加了一些示例代码。如果你有问题,不要犹豫。