在java中进行解锁调用

时间:2011-04-08 10:34:10

标签: java multithreading call blocking

一旦我的报告状态完成,我正在调用外部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);

3 个答案:

答案 0 :(得分:2)

如果您正在寻找异步调用,您应该考虑在单独的线程上调用此函数。您可以通过创建线程池并告诉它为您执行此代码来完成此操作。然后代码将在后台运行,直到完成为止,在这种情况下,您可以使用它执行某些操作。那么你唯一需要做的就是将它包装在Runnable中,并在结束时与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();
}

并且可以运行:

   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将“轮询”服务器,就像您在代码中描述的那样。最后,当轮询完成时,它将调用CallBackFunction来通知完整性发生了变化。

我希望这会有所帮助。

P.S。:我在事件队列上运行回调函数。这可能是您的应用程序所必需的,但如果您正在进行GUI工作,这可能会更安全。

答案 1 :(得分:0)

您应该在另一个线程中执行此操作,然后您将能够将其作为异步调用

答案 2 :(得分:0)

使用ExecutorService执行异步调用,因此请求由executor.Check java.util.concurrent.Executors中的线程池完成,它包含一些线程池。然而,当关闭线程池以确保所有接受的请求在应用程序退出时完成时,这是一个问题