【问题标题】:Making unblocking calls in java在java中进行解锁调用
【发布时间】:2011-04-08 10:34:09
【问题描述】:

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

【问题讨论】:

  • reportStatus != "Completed" 错误,你应该使用(!reportStatus.equals("Completed")) 来比较字符串。
  • 你贴的代码看起来不错,你说的解锁是什么?报告完成后你会收到一些事件吗?
  • Yes.. 所以你可以假设我提交了一个查询,我等待它的状态从挂起->执行->完成。一旦查询完成,只有我可以从另一个 API 获取查询结果。而不是每次都睡25秒..我想使用线程,这样oen线​​程将读取状态,如果状态完成,另一个线程将获取结果..我们如何实现这一点的任何想法..我是否必须存储这些状态在我的本地数据库中,并有两个线程读取值

标签: java multithreading call blocking


【解决方案1】:

如果您正在寻找异步调用,您应该考虑在单独的线程上调用此函数。您可以通过创建一个线程池并告诉它为您执行此代码来做到这一点。然后代码将在后台运行,直到完成,在这种情况下,您可以使用它做一些事情。然后你唯一需要做的就是将它包装在一个 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 的东西,这可能会更安全。

【讨论】:

  • 我添加了一些示例代码。如果您有任何问题,请不要犹豫。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多