2016-04-13 4 views
0

Я пытаюсь понять, почему приведенный ниже код не распечатывает трассировку стека исключения NumberFormatException при запуске?Java: ExecutorService и Callables, неспособные поймать исключение

Я не уверен, что это обычное использование callables и ExecutorService таким образом, я googled и не мог найти решение моей проблемы ... может быть что-то действительно очевидное, что я не вижу.

import java.util.ArrayList; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class CallablesTest { 

    private final static ArrayList<Callable<Void>> mCallables = new ArrayList<>(); 
    private final static ExecutorService mExecutor = Executors.newFixedThreadPool(4); 

    public static void main(String[] args) throws Exception{ 
     testMethod(); 
    } 

    static void testMethod() throws Exception { 

     mCallables.clear(); 

     for(int i=0; i<4; i++){ 
      mCallables.add(new Callable<Void>() { 

       @Override 
       public Void call() throws Exception { 
        //if (Thread.currentThread().isInterrupted()) { 
        // throw new InterruptedException("Interruption"); 
        //} 
        System.out.println("New call"); 
        Double.parseDouble("a"); 

        return null; 
       } //end call method 

      }); //end callable anonymous class 
     } 
     try { 
      mExecutor.invokeAll(mCallables); 
      mExecutor.shutdown(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

В настоящее время ни одна часть вашего кода не выдает 'NumberFormatException'. 'ExecutorService' не предоставляет прямых исключений, вызванных асинхронным запуском' Callable'. – Savior

+0

Извините, произошла ошибка в коде. Теперь должно быть исключение NumberFormatException. Хотя я не понимаю ваш комментарий: «ExecutorService не раскрывает непосредственно исключения, вызванные асинхронным запуском Callables». – HollowBastion

+0

Точка «ExecutorService» обычно выступает в качестве пула потоков и, следовательно, выполняет ваши «Callable» (ы) для разных потоков. Если выполнение вашего «Callable» выдает исключение в одном из этих других потоков, «ExecutorService» (по умолчанию) не перехватывает его. Он просто отбрасывает его. Вы можете настроить все это, посмотрите на «ThreadPoolExecutor». – Savior

ответ

0

Я думаю, что я, возможно, нашли ответ на свой вопрос ... если вы будущие объекты вернулись из ExecutorService.invokeAll ... а затем окружать будущее «получить» звонки с Try/уловом блок, вы можете поймать исключение

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class ThreadTest { 

    private final static ArrayList<Callable<Boolean>> mCallables = new ArrayList<>(); 
    private final static ExecutorService mExecutor = Executors.newFixedThreadPool(4); 

    public static void main(String[] args) throws Exception{ 
     testMethod(); 
    } 

    static void testMethod() throws Exception { 

     mCallables.clear(); 

     for(int i=0; i<4; i++){ 
      mCallables.add(new Callable<Boolean>() { 

       @Override 
       public Boolean call() throws Exception { 
        //if (Thread.currentThread().isInterrupted()) { 
        // throw new InterruptedException("Interruption"); 
        //} 
        System.out.println("New call"); 

        double d = Double.parseDouble("a"); 

        return true; 
       } //end call method 

      }); //end callable anonymous class 
     } 
     try { 
      List<Future<Boolean>> f= mExecutor.invokeAll(mCallables); 
      f.get(1).get(); 
      f.get(2).get(); 
      f.get(3).get(); 
      f.get(0).get(); 

     } catch (Exception e) { 
      String s = e.toString(); 
      System.out.println(s); 
     } 

     mExecutor.shutdown(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^