2016-11-28 4 views
0

Я использую ExecutorService (объявлено глобально) для запуска многопоточно в то же время. ExecutorService займет час, чтобы выполнить задачу. Так что мне нужно получить текущие текущие данные о потоке, такие как активная тема, queued thread и завершена нить.Получайте текущие потоковые объекты из ExecutorService

И когда я убить ExecutorService, то ExecutorService убит, но нить работает в фоновом режиме. Поэтому, прежде чем убить ExecutorService, мне нужно получить форму объекта потока ExecutorService и убить поток вручную, используя loop или итератор.

Для примера:

ExecutorService имеет 5 нитей.

Каждый поток имеет выполнение invokeall(). Каждая нить заканчивается через час.

Но мне нужно остановиться в течение 15 минут, отправив новый запрос на сервер или вызов какой-либо метод.

Здесь выключение или shutdowNow остановить исполнителя, но не те 5 нитей. В этом проблема. Поэтому мне нужно убить эти потоки вручную. Как убить потоки, прикрепленные вручную в службе-исполнителе?

+0

Обычно ваш основной поток будет называть 'awaitTermination()' в основном потоке, который будет эффективно присоединяться к нему и предотвращать завершение до завершения заданий. У вас есть код, который вы пробовали до сих пор? –

+1

Возможный дубликат [Как дождаться окончания всех потоков, используя ExecutorService?] (Http://stackoverflow.com/questions/1250643/how-to-wait-for-all-threads-to-finish-using-executorservice) – Sikorski

+0

Не могли бы вы пояснить: нужно ли вам сами * создавать темы * или * задачи * и почему? Как показывают другие комментарии, есть способ узнать, завершил ли исполнитель свою работу, получить количество ожидающих задач, ... и если это ваша цель, то потоки на самом деле являются ** не ** хорошей единицей абстракции для работать вообще. Кроме того, вы не можете убить и выполнить сервис, вы можете только закрыть его, что имеет другое значение для того, что происходит с его задачами, и его потоки. Также нет способа убить потоки на Java (только устаревшие, ненадежные способы) – GPI

ответ

0

Я нашел решение, все потоки добавить в отзывной и ссылаться на отзывной темы с помощью ExecutorService. ExecutorService содержит только данные о состоянии, очереди и завершенных данных. После выполнения результат будет извлекать значение, используя Будущее класс.

Теперь, если я хочу остановить выполнение до завершения. Мне нужно вызвать вызываемый объект и преобразовать в объект потока и остановить вручную, если поток не равен нулю. Таким образом, объект Callable также изменяется как глобальная переменная. Окончательное выполнение удаляет эти объекты.

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

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