Как подсчитать количество завершенных потоков в Java без опроса статуса потоков - PullRequest
0 голосов
/ 21 июля 2011

В Java-программе мне нужно запустить n потоков, и каждый поток выполняет операцию.Все эти потоки продолжают работать параллельно.Я должен следить за количеством потоков, которые завершили свою работу, чтобы отмечать ход операции в процентах.

Единственный способ, о котором я мог подумать, - это опросить весь массив потоков и продолжать проверять их состояние, если все узлы не завершили свое выполнение.Тем не менее, это потеря процессора, есть ли какой-нибудь другой способ добиться этого?

Ответы [ 3 ]

2 голосов
/ 21 июля 2011

Легко. Пусть каждый поток (или Runnable каждого потока) увеличивает общий экземпляр AtomicInteger после его завершения.

Другие альтернативы включают:

  • с использованием Semaphore или CountdownLatch
  • использование обратного вызова; например использование событий и прослушиватель событий
  • с использованием wait() и notify().

Но будьте осторожны. Если вы используете этот счетчик, чтобы определить, завершены ли все потоки, вам также придется иметь дело со случаем, когда поток умирает из-за необработанного исключения. Вы можете сделать это, используя необработанный обработчик исключений.

1 голос
/ 21 июля 2011

Вы должны прочитать эту статью.Он упоминает несколько возможностей со своими плюсами и минусами и заканчивается уже упомянутым AtomicInteger.

0 голосов
/ 21 июля 2011

Вы можете увеличить глобальное поле AtomicInteger только в конце потока run() метод.

...