Как остановить потоки Java-программы? - PullRequest
4 голосов
/ 13 октября 2009

Я сделал Java-программу с графическим интерфейсом и поместил на нее кнопку «Стоп». Когда я запускаю программу, основной поток запускает 10 потоков. Теперь я хочу, чтобы всякий раз, когда пользователь нажимал на кнопку «Стоп», все потоки сначала заканчивались, а затем заканчивался основной поток. Как я могу это сделать.

Ответы [ 6 ]

12 голосов
/ 13 октября 2009

Это зависит от того, как вы хотите, чтобы 10 потоков «заканчивались», и от того, как вы запускаете потоки.

Я рекомендую создать ExecutorService и записать ваши "нити" в виде Runnable реализаций. Эти Runnable объекты должны отвечать на вызовы interrupt() в своем потоке выполнения, прерывая свою задачу, очищая и выходя из метода run как можно быстрее.

Отправьте эти Runnable задачи на ExecutorService, затем вызовите awaitTermination, все в главном потоке. Когда пользователь нажимает кнопку «Стоп», вызовите shutdown или shutdownNow по желанию на ExecutorService (из потока рассылки событий).

Если вы вызовете shutdownNow в службе исполнителя, она уведомит запущенные задачи, прерывая их потоки. Если вы позвоните shutdown, это позволит выполнять задачи без перерыва. В любом случае, ваш основной поток будет блокироваться на awaitTermination до тех пор, пока все задачи не будут выполнены (или не истечет срок).

Конечно, вы можете создавать и управлять всеми потоками самостоятельно, используя join. Главное - сделать потоки прерываемыми, если вы хотите остановить их преждевременно.

6 голосов
/ 13 октября 2009

Во-первых, позвольте мне заметить, что в классе Thread есть заманчивый метод с именем stop(). Не используйте его, это опасно .

Один из способов сделать это - кодировать ваши 10 потоков, чтобы проверить прерванный статус потока.

например.

while (! Thread.interrupted())
{
     // Do your thread's work
}

Вы можете прервать каждый рабочий поток, вызвав метод interrupt() объекта Thread, а затем вызвав join(), чтобы дождаться завершения потока.

5 голосов
/ 13 октября 2009

Дайте всем потокам общий экземпляр Boolean и пусть они периодически проверяют, является ли он true. Если это true, поток должен вернуться из своего метода run. Установите для этого логического значения значение true, если пользователь нажимает кнопку остановки, а затем используйте Thread.join() для ожидания всех потоков.

3 голосов
/ 13 октября 2009

Thread.stop () устарела, и рекомендуется использовать флаг «Выполнение», который периодически проверяется потоком, чтобы он мог завершиться сам, когда вы установите для флага значение false. Если поток имеет длительные фазы ожидания, вы можете прервать () его, чтобы вывести его из состояния ожидания (). -> Thread.stop () в документации по API Java

После завершения потоков, установив для условия выполнения значение false, вы можете сделать так, чтобы основной поток присоединился () к другим потокам последовательно, чтобы дождаться их завершения.

2 голосов
/ 13 октября 2009

Методы suspend () и resume () в классе Thread объявлены устаревшими, поскольку по сути они не сохранены. Посмотрите в этой статье информацию о том, почему они устарели, и о методах остановки потоков:

http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

0 голосов
/ 14 октября 2009

Если ваши потоки ожидают входной поток, просто добавьте логический флаг в потоки и закройте поток. Темы будут просыпаться, проверять флаг и выходить. То же самое, если они ожидают условия (Object.wait ()), используйте notifyAll () и установите флаг. Если ваши потоки постоянно зацикливаются (что плохо), просто установите флаг:)

...