Главный поток

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

  • Это поток, от которого порождаются все "дочерние" потоки.
  • Часто он должен быть последним потоком, завершающим выполнение, так как он предпринимает различные завершающие действия.

Несмотря на то что главный поток создается автоматически при запуске программы, им можно управлять через объект Thread. Чтобы делать это, вы должны получить ссылку на него вызовом метода current-Thread (), который является общедоступным статическим (public static) методом класса Thread. Его общая форма выглядит следующим образом:

static Thread currentThread ()

Этот метод возвращает ссылку на поток, из которого он был вызван. Получив ссылку на главный поток, вы можете управлять им точно так же, как любым другим. Рассмотрим следующий пример:

// Управление главным потоком.
class CurrentThreadDemo {
public static void main(String args[]) {
Thread t = Thread.currentThread ();
System.out.println("Текущий поток: " + t) ;
// изменить имя потока
t.setName("Мой Thread");
System.out.println("После изменения имени: " + t) ;
try {
for(int n = 5; n > 0; n—) {
System.out.println(n);
Thread.sleep(1000);
}
}
catch (InterruptedException e) {
System.out.println("Главный поток прерван");
}
}
}

В этой программе ссылка на текущий поток (в данном случае — главный) получается вызовом currentThread (), и эта ссылка сохраняется в локальной переменной t. Далее программа отображает информацию о потоке. Программа вызывает setName () для изменения внутреннего имени потока. После этого информация о потоке отображается заново. Далее в цикле печатается обратный отсчет с задержкой на 1 секунду после каждой строки. Пауза организуется вызовом метода sleep (). Аргумент sleep () задает период задержки в миллисекундах. Обратите внимание на блок try/catch вокруг цикла. Метод sleep () в Thread может возбудить InterruptException. Это может произойти, если некоторый другой поток захочет прервать выполнение этого спящего потока. Этот пример просто печатает сообщение, если поток прерывается. В реальных программах вы будете обрабатывать подобную ситуацию иначе. Ниже показан вывод, генерируемый этой программой.

Текущий поток: Thread[main,5,main]
После изменения имени: Thread[My Thread,5,main]
5
4
3
2
1

Обратите внимание, что вывод генерируется, когда t используется в качестве аргумента для println (). Он отображает по порядку имя потока, его приоритет и имя его группы. По умолчанию имя главного потока — main. Его приоритет равен 5, что является значением по умолчанию, a main — также имя группы потоков, к которой относится данный. Группа потоков — это структура данных, которая управляет состоянием набором потоков в целом. После того как имя потока изменено, t распечатывается вновь. На этот раз отображается новое имя потока.

Давайте поближе взглянем на методы, определенные в Thread, которые используются в программе. Метод sleep () заставляет поток, из которого он был вызван, приостановить выполнение на указанное количество миллисекунд. Его общая форма выглядит так:

static void sleep(long миллисекунды) throws InterruptedException

Количество миллисекунд, на которое нужно приостановить выполнение, передается в параметре миллисекунды. Этот метод может возбуждать исключение Interrupted-Exception.

Метод sleep () имеет также вторую форму, показанную ниже, который позволяет задать период в миллисекундах и наносекундах:

static void sleep(long миллисекунды, long наносекунды) throws InterruptedException

Вторая форма может применяться только в средах, которые предусматривают задание временных периодов в наносекундах.

Как показано в предыдущей программе, вы можете установить имя потока, используя setName (). Получить имя потока можно вызовом getName () (эта процедура в программе не показана). Эти методы являются членами класса Thread и объявлены следующим образом: final void setName(String имя_потока) final String getName()

Здесь имя_потока указывает имя потока.