Будущие задачи асинхронных вызовов зависают при возникновении исключения - PullRequest
0 голосов
/ 15 июля 2011

Я написал много вызовов Async Future Task Call один под другим в моей 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
    }

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

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

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Я был действительно выключен на этом. Правильный ответ - использовать 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

0 голосов
/ 15 июля 2011

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

...