Вы можете представить несколько задач как
List<Callable<T>> tasks
Тогда, если вы хотите, чтобы компьютер фактически выполнял их параллельно, используйте
ExecutorService executorService = .. initialize executor Service
List<Future<T>> results = executorService.invokeAll ( ) ;
Теперь вы можете перебирать результаты.
try
{
T val = result . get ( ) ;
}
catch ( InterruptedException cause )
{
// this is not the exception you are looking for
}
catch ( ExecutionExeception cause )
{
Throwable realCause = cause . getCause ( ) // this is the exception you are looking for
}
Таким образом, realCause (если оно существует) является любым исключением, которое выдается в связанной задаче.