проверить состояние асинхронных потоков в Java - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть метод в классе MyClassB, который запускается асинхронно из метода MyClassA:

public void getProductCall()
{
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                productRequest = service.createS4ProductRequest(getRepriceItems());

// Ниже приведен вызов покоя другой системе String response = pricing.getS4ProductResponse (quote.getAssetQuoteNrAndVrsn (), productRequest);// Я использую следующие 2 строки, чтобы проверить из метода ClassA, чтобы увидеть, завершился ли этот процесс setProductResponse (response);productPriceProcessEnded = true;

            } catch (Exception e) {
                productPriceErrorOccured=true;
                e.printStackTrace();

            }
        }
    }).start();
}

Это фрагмент кода в MyClassA, который я использовал, чтобы проверить, завершен ли вышеуказанный метод.

for(int i=0;i<1000000000;i++)
{
    if(!networkAsynCalls.isListPriceErrorOccured())
{
    if(networkAsynCalls.isListPriceprocessEnded())
    {
        return networkAsynCalls.getListReponse();   
    }
    else
    {
        Thread.sleep(250);
        continue;
    }

}
else
    return null;
}

вместо использования этого случайного цикла forиспользовать какой-либо встроенный метод или пул услуг или что-то?Потому что

1) Этот поток в методе находится в другом классе. 2) В классе MyClassB у меня есть еще несколько таких методов, поэтому мне нужно проверить состояние всех методов в MyClassA

.Спасибо за любую помощь.

1 Ответ

0 голосов
/ 16 марта 2019

Если я понимаю, что вы пытаетесь сделать, это отправить некоторый код для асинхронного запуска, тогда вы сможете дождаться его завершения (успешно или неудачно).Если это так, вы должны взглянуть на Futures .

Вот пример, основанный на Javadoc:

FutureTask<String> future =
   new FutureTask<String>(new Callable<String>() {
     public String call() {
       // do stuff
       return "result";
   }});

Этот код создает объект "будущее"msgstr "это может быть вызвано для выполнения поисковика. поиск (цель).На этом этапе код не выполняется вообще.У вас просто есть объект, представляющий вычисления, которые могут выполняться асинхронно.Для этого вы должны позвонить:

 ExecutorService executor = Executors.newFixedThreadPool(5);
 executor.execute(future);

Этот фрагмент создал Executor (который является фиксированным пулом из 5 потоков), а затем передал ему будущее для выполнения.Исполнитель будет выполнять вычисления из Future в асинхронном режиме.

Future предлагает несколько методов (см. Javadoc) для ожидания завершения, отмены, проверки состояния завершения и т. Д. Например,

 String result = future.get();

заблокирует, ожидая результата бесконечно.Функция get (10, TimeUnit.SECONDS) будет ждать 10 секунд, а если будущее не завершено, бросить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...