Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
Thread 4, Thread 4, |
Thread 16, Thread 8, Thread 16, Thread 8, Thread 16, Thread 8, Thread 16, Thread 8, Thread 16, Thread 8, Thread 16, Thread 8, Thread 8, Thread 4, Thread 4, Thread 2, Thread 2,
Несмотря на то, что демон-поток никогда не выходит из методг гип(), виртуальная машина прекращает работу, как только все не-демон-потоки завершаются.
В примере использовалось несколько дополнительных классоп и методов, которые еще не были рассмотрены:
• класс ThreadGroup
Все потоки находятся в группах, представляемых экземплярами класса ThreadGroup. Группа указывается при создании потока. Если группа не была указана, то поток помешается в ту же группу. где находится поток, породивший его.
Методы асйуеСоиптД) и епитегаге() возвращают количество и полный список, соответственно, всех потоков в группе.
• sleep()
HeZ;Сущего""НОГ0" КЛЭССа Thread "Рио-анашшвает выпол- ОбратиГвЗанТе УКа3аНН°е КОЛИЧес™ миллисекунд
иоратите внимание, что метод требует обработки исключения
|пт.еггиргг^Ехсерпоп. Он связан с возможностью активизировать метод, который приостановил свою работу. Например, если поток занят выполнением метода з1еер(), то есть бездействует на протяжении указанного периода времени, его можно вывести из этого состояния, вызвав метод 1пг.еггирг() из другого потока выполнения. В результате метод з1еер() прервется исключением 1гг1еггир1^Ехсерпоп. Кроме метода э1еер(), существует еще один статический метод без параметров. Когда поток вызывает его, он временно приоста-цавливает свою работу и позволяет отработать другим потокам. Один из щетодов обязательно должен применяться внутри бесконечных циклов ожидания, иначе есть риск, что такой ничего не делающий поток затормозит работу остальных потоков.
Синхронизация
При многопоточной архитектуре приложения возможны ситуации, когда несколько потоков будут одновременно работать с одними и теми жеданными, используя их значения и присваивая новые. В таком случае результат работы программы становится невозможно предугадать, глядя только на исходный код. Финальные значения переменных будут зависеть от случайных факторов, исходя из того, какой поток какое действие успел сделать первым или последним.
Рассмотрим пример:
public class ThreadTest {
private int a=1, b=2; public void one() { a=b;