2012-07-11 10 views
9

Próbuję zaimplementować przykładową aplikację do przetestowania interfejsów Callable i ExecutorService.Jak zatrzymać zgłoszenie przesłane do ExecutorService?

W moim app I oświadczyli:

ExecutorService exSvc = Executors.newSingleThreadExecutor(); 

Następnie:

Future<Integer> test = exSvc.submit(
    new Callable<Integer>() { 
     public Integer call() { 
      for(int i = 0; i < 1000; i++){ 
       System.out.println(i); 
      } 
      return 1; 
     } 
    }); 

Teraz staram się zatrzymać proces zanim zakończyć używam exSvc.shutdownNow() ale to nie robi praca.

Aby zatrzymać z wdziękiem klasyczny Thread, zwykle używam jakiejś zmiennej warunkowej . Jakie jest wspólne podejście do postępowania z ExecutorService?

Odpowiedz

16

Future.cancel(true) i ExecutorService.shutdownNow() przerwanie użycie nici. Tak długo, jak nie zrobić żródło połączeń zablokowania w swoim zadaniu, co potrzebne jest do obsługi stan przerwanej prawidłowo, coś takiego:

for(int i = 0; i < 1000; i++){ 
    // Uses isInterrupted() to keep interrupted status set 
    if (Thread.currentThread().isInterrupted()) { 
     // Cannot use InterruptedException since it's checked 
     throw new RuntimeException(); 
    } 
    System.out.println(i); 
} 

Jeśli się żródło połączenia blokujące (takie jak sieci IO), rzeczy stają się bardziej złożone, musisz je jakoś ręcznie przerwać, na przykład zamykając podstawowe gniazda.

+0

Czy istnieje sposób na zatrzymanie procesu bez przerywania gwintowania? – davioooh

+0

Nie jest jasne, czego dokładnie chcesz. 'shutdownNow()' już używa przerwania. – axtavt

+0

Tak, rzeczywiście, pytam, jak go zatrzymać ** bez ** przerwania wątku. Użycie 'shutdownNow()' jest jedynym sposobem na zatrzymanie wątku przesłanego do 'ExecutorService'? – davioooh

3

Tak właśnie zrobiłbym z FixedThreadPool, mam nadzieję, że to pomoże.

ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 

    List<Future<Void>> results = new ArrayList<>(); 

    for (int i = 0; i < numberOfJobs; i++) { 
     MyCallableJob job = new MyCallableJob (...); 
     results.add(pool.submit(job)); 
    } 

    for (Future<Void> result : results) { 
     try { result.get(); } 
     catch (InterruptedException | ExecutionException ignorable) { } 
    } 

    pool.shutdown(); 
Powiązane problemy