0

Я написал много задач Async Future Calls один под другим в моей программе 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 вызова получить() внутри один TRY/поймать блока, я не вижу исключение приходит поймать блок и моя java-программа просто стоит на месте. Все три вызова метода происходят одновременно.

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() в отдельный блок 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

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

по-прежнему висит ... – Shiv

0

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

+0

Позвольте мне изучить, что программа – Shiv