2014-02-12 2 views
0

У меня есть пул потоков с 5 потоками и их будущие ручки хранятся в ArrayList. То, что я хочу сделать, - это вернуться к основному потоку после выхода всех потоков. Моя ситуация заключается в создании программы, которая выполняется бесконечно. Моя концепция проста, но я не уверен, как ее реализовать.Вернуться в основной поток после того, как threadpool выключится?

  1. main() метод называет threadManager() методы
  2. threadManager() создает потокам
  3. Некоторую нить генерирует исключение и вопросы futureCancel() метода, который выдает future.cancel для всех потоков, а затем закрывает пул потоков
  4. Программы возвращается к основному методу, который снова вызывает threadManager() и продолжается.
+0

Не могли бы вы переименовать 'futureCancel' (что-то вроде' restartThreads') и построить вызов 'threadManager' в конце его? (Возможно, вы можете запустить новый поток для запуска 'threadManager', если поток обработки ошибок не является хорошим местом для его запуска.) Мне кажется, что в конце концов вы хотите закрыть все на эту ошибку и запустите все это. 'main' не является особенным; вы можете сделать это любым способом в любом потоке. Одна нота: я бы удостоверился, что существует какой-то чистый способ закрыть приложение. – jpmc26

+0

Вы поняли, что в конце ошибки я должен был закрыть все и перезапустить его. Я думаю, что могу просто сделать futureCancel (restarThread) новым потоком за пределами старого пула, который отключает старый и пул и перезапускает новый. –

+0

У меня есть крюк отключения, который я использую для любого катастрофического события, которое очищает все мои сетевые подключения до неправильного завершения работы. –

ответ

0

Это то, что вы пытаетесь сделать?

// Always has 5 threads even if 1 throws an exception 
ExecutorService exe = Executors.newFixedThreadPool(5); 

List<T> results = new ArrayList<T>(); 
while(results.isEmpty()) { 
    List<Callable<T>> tasks = createTasks(); 
    List<Future<T>> futures = exe.invokeAll(tasks); 

    for(Future<T> future : futures) { 
     try{ 
      results.add(future.get()); // throws InterruptedException, ExecutionException 
     } catch(Exception e) { 
      results.clear(); 
      break; 
     } 
    } 
} 
+0

Нечто похожее. Но я не сохраняю результаты. Поэтому я использую внешнюю библиотеку, которая помогает обнаруживать таймаут по соединению, которое создает мои потоки. Как только я получаю тайм-аут в одном соединении, я иду и выдаю «future.cancel» для остальных. Есть ли способ вернуться в основной поток после этого метода? Добавление цикла while (true) является вариантом, но мне нужно что-то еще, которое блокируется при действии или что-то в этом роде. –

+0

Я не понимаю вашу концепцию «вернуться к» основной теме. Основная нить не перестает работать. Нити не «идут» и «возвращаются» друг от друга. Они созданы, они бегут, иногда они останавливаются. Они не «посещают» друг друга. – Stewart

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