Асинхронные вызовы будущей задачи зависают при возникновении исключения

Я написал много асинхронных вызовов будущих задач один под другим в своей Java-программе. Предоставление одного образца ниже

FutureTask<List<ConditionFact>> x = getConditionFacts(final Member member);
FutureTask<List<RiskFact>> x = getRiskFacts(final Member member);
FutureTask<List<SAEFact>> x = getSAEFacts(final Member member);

Теперь предположим, что я намеренно создаю исключение во втором вызове выше и заключаю все 3 вызова get() в один блок try/catch. Я не вижу исключения, поступающего в блок catch, и моя java-программа просто стоит на месте. Все 3 вызова метода происходят одновременно.

try {   
FutureTask<List<ConditionFact>> task = getConditionFacts(member);
        // wait for the task to complete and get the result:

            List<ConditionFact> conditionFacts = task.get();

      FutureTask<List<ConditionFact>> task = getRiskFacts(member);
        // wait for the task to complete and get the result:

            List<RiskFact> conditionFacts = task.get();
        }
        catch (ExecutionException e) {
            // an exception occurred.
            Throwable cause = e.getCause(); // cause is the original exception thrown by the DAO
        }

Но если я заключаю каждый из get() в отдельные блоки try catch, я могу их поймать. Почему? Также в тот момент, когда я начинаю заключать каждый метод get() в блоки try catch, я теряю многопоточность. Вызовы методов происходят один за другим, как закодировано

      FutureTask<List<ConditionFact>> task = getConditionFacts(member);
    // wait for the task to complete and get the result:
    try {
        List<ConditionFact> conditionFacts = task.get();
    }
    catch (ExecutionException e) {
        // an exception occurred.
        Throwable cause = e.getCause(); // cause is the original exception thrown by the DAO
    }
  FutureTask<List<ConditionFact>> task = getRiskFacts(member);
    // wait for the task to complete and get the result:
    try {
        List<RiskFact> conditionFacts = task.get();
    }
    catch (ExecutionException e) {
        // an exception occurred.
        Throwable cause = e.getCause(); // cause is the original exception thrown by the DAO
    }

когда я могу поймать исключение, я теряю многопоточность, а когда я могу создавать несколько потоков, я теряю исключение.

Любые идеи, как обрабатывать исключения по отдельности и одновременно достигать многопоточности


person juniorbansal    schedule 15.07.2011    source источник


Ответы (2)


Я действительно был в стороне от этого. Правильный ответ — использовать ExecutorService для запуска задач в пуле потоков.

ExecutorService executor = Executor.newFixedThreadPool(2);
FutureTask<List<ConditionFact>> task1 = getConditionFacts(member);
FutureTask<List<ConditionFact>> task2 = getRiskFacts(member);
executor.execute(task1);
executor.execute(task2);
// wait for the task to complete and get the result:
try {
    List<ConditionFact> conditionFacts = task1.get();
}
catch (ExecutionException e) {
    // an exception occurred.
    Throwable cause = e.getCause(); // cause is the original exception thrown by the DAO
}
// wait for the task to complete and get the result:
try {
    List<RiskFact> conditionFacts = task2.get();
}
catch (ExecutionException e) {
    // an exception occurred.
    Throwable cause = e.getCause(); // cause is the original exception thrown by the DAO
}

Это решит проблему однопоточного выполнения. Я получил ответ здесь: http://programmingexamples.wikidot.com/futuretask

person g051051    schedule 15.07.2011

ExecutorCompletionService должен помочь решить ваши проблемы. Ваш код нуждается в реализации механизма очереди для обработки результатов, и ExecutorCompletionService должен помочь. Проверьте это.

person Karthik Jayakumar    schedule 15.07.2011