Выполнение разблокировки звонков в Java - PullRequest
1 голос
/ 08 апреля 2011

Я звоню по внешнему интерфейсу 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 ]

2 голосов
/ 08 апреля 2011

Если вы ищете асинхронные вызовы, вам следует обратиться к вызову этой функции в отдельном потоке.Вы можете сделать это, создав пул потоков и предложив ему выполнить этот код за вас.Затем код будет работать в фоновом режиме, пока не будет завершен, и в этом случае вы можете что-то с ним сделать.Тогда единственное, что вам нужно сделать, это обернуть его в 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, чтобы уведомить об изменении полноты.

Надеюсь, это поможет.

PS: я запускаю функцию обратного вызова в очереди событий.Это может быть необходимо для вашего приложения, но если вы занимаетесь графическим интерфейсом, это может быть безопаснее.

0 голосов
/ 08 апреля 2011

использует ExecutorService для выполнения асинхронных вызовов, и, таким образом, запрос завершается пулом потоков в executor.Check java.util.concurrent.Executors, он содержит несколько пулов потоков. Тем не менее, проблема заключается в том, что когда закрывать пул потоков, чтобы убедиться, что все принятые запросы завершены при выходе из приложения

0 голосов
/ 08 апреля 2011

Вы должны сделать эту операцию в другом потоке, тогда вы сможете сделать это как асинхронный вызов

...