Потоки выполнения. Методы класса Thread: getName(), run(), start(), sleep(). Примеры использования
Перед изучением данной темы рекомендуется ознакомиться со следующей темой:
Содержание
- 1. Метод getName(). Получить имя потока. Пример
- 2. Методы run(), start(). Запуск и выполнение потока. Пример
- 3. Метод sleep(). Задержка выполнения потока. Пример
- Связанные темы
Поиск на других ресурсах:
1. Метод getName(). Получить имя потока. Пример
Пример определения имени главного потока и дочернего потока. Дочерний поток реализован в классе MyThread, который содержит следующие элементы:
- внутреннее поле thr, которе есть ссылкой на класс Thread;
- конструтор MyThread (String). Конструктор получает входным параметром имя создаваемого потока, который запускается на выполнение;
- метод run(). В этом методе запрограммирована некоторая работа, которую выполняет поток;
- метод getNameThread() — возвращает имя созданного потока путем вызова метода getName().
// Класс, инкапсулирующий поток выполнения class MyThread implements Runnable { Thread thr; // ссылка на текущий поток // Конструктор класса MyThread - получает название потока MyThread(String name) { // Создать экземпляр thr и установить ему название потока thr = new Thread(this, name); // Запустить поток на выполнение thr.start(); // вызывается метод run() } // Точка входа в поток - метод run() public void run() { // выполнить некоторую работу в потоке System.out.println("MyThread.run() - begin"); for (int i=0; i<200; i++) { try { Thread.sleep(5); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } System.out.println("MyThread.run() - end"); } // Метод, возвращающий имя потока thr String getNameThread() { // вызвать метод getName() класса Thread return thr.getName(); } } public class Threads { public static void main(String[] args) { // Метод getName() - получить имя потока. // 1. Получить имя главного потока и вывести его на экран Thread mainThread = Thread.currentThread(); String name = mainThread.getName(); // name = "main" System.out.println("name of main Thread = " + name); // 2. Получить имя дочернего потока // 2.1. Создать дочерний поток и задать ему имя MyThread t1 = new MyThread("Thread-1"); // 2.2. Вывести имя дочернего потока для контроля System.out.println(t1.getNameThread()); } }
Результат выполнения программы
name of main Thread = main Thread-1 MyThread.run() - begin MyThread.run() - end
⇑
2. Методы run(), start(). Запуск и выполнение потока. Пример
Методы start() и run() используются при запуске и выполнении потока. Метод start() используется для указания того, что поток выполнения нужно запустить. В своем коде метод start() обращается к методу run().
Общая форма метода start() следующая:
public void start()
В методе run() указывается код, который должен выполняться в потоке. Метод run() является точкой входа в поток. Метод run() объявлен в интерфейсе Runnable. Для того, чтобы в классе инкапсулировать поток выполнения нужно реализовывать интерфейс Runnable и переопределять метод run() по образцу ниже
class MyThreadClass implements Runnable { // ... void run() { // код потока // ... } }
Код метода run() начинает выполняться только после вызова метода start(). Общая форма метода run() следующая:
void run()
Пример. В примере демонстрируются различные способы запуска и создания потока. В этих способах используются методы start() и run() класса Thread.
// Создание потока с использованием способа наследования класса Thread class MyThread1 extends Thread { // Метод, который начинает выполнение потока public void startThread1() { // Метод вызывает метод start() класса Thread для запуска потока // 1. Создать поток, укзав ему собственный экземпляр Thread thr = new Thread(this, "MyThread1"); // 2. Запустить поток thr.start(); // вызывается метод run() } // Метод run() класса public void run() { // Вывести сообщение о начале выполнения потока System.out.println("MyThread1.run() - begin"); try { Thread.sleep(500); // выполнить некоторую работу в потоке for (int i=0; i<10000; i++); } catch (InterruptedException e) { e.getMessage(); } // Вывести сообщение об окончании выполнения потока System.out.println("MyThread1.run() - end"); } } // Создание потока с использованием способа реализации интерфейса Runnable class MyThread2 implements Runnable { // Метод, который начинает выполнение потока public void startThread2() { // Метод вызывает метод start() класса Thread для запуска потока // 1. Создать поток, указав ему собственный экземпляр Thread thr = new Thread(this, "MyThread1"); // 2. Запустить поток thr.start(); // вызывается метод run() } // Метод run() - выполнение потока public void run() { // Вывести сообщение о начале выполнения потока System.out.println("MyThread2.run() - begin"); try { Thread.sleep(500); // выполнить некоторую работу в потоке for (int i=0; i<10000; i++); } catch (InterruptedException e) { e.getMessage(); } // Вывести сообщение об окончании выполнения потока System.out.println("MyThread2.run() - end"); } } public class Threads { public static void main(String[] args) { // Демонстрация методов start() и run() // 1. Объявить экземпляры классов MyThread1 и MyThread2 MyThread1 mt1 = new MyThread1(); MyThread2 mt2 = new MyThread2(); // 2. Запустить потоки на выполнение mt1.startThread1(); mt2.startThread2(); } }
Результат выполнения программы
MyThread1.run() - begin MyThread2.run() - begin MyThread1.run() - end MyThread2.run() - end
⇑
3. Метод sleep(). Задержка выполнения потока. Пример
Метод sleep() используется для указания задержки в миллисекундах в выполняемом потоке. После этого поток, который выполняется будет приостановлен на указанное время, что позволит выполнить другие (если таковые имеются) параллельно-выполняемые потоки.
В документации Java общая форма метода sleep() следующая
public static void sleep(long millis) throws InterruptedException
здесь
- millis – количество миллисекунд, на которые приостанавливается поток.
Если нужно установить задержку в 1 секунду, то вызов метода sleep() в программном коде может быть, например, таким:
... try { Thread.sleep(1000); // Код выполнения потока // ... } catch (InterruptedException e) { // ... }
Пример. В примере создается задержка в 2 секунды для главного и дочернего потоков.
// Класс, инкапсулирующий поток class MyThread implements Runnable { public void run() { // Начало выполнения потока System.out.println("MyThread.run() - begin"); // Установить задержку в 2 секунды try { Thread.sleep(2000); } catch (InterruptedException e) { e.getMessage(); } // Конец выполнения потока System.out.println("MyThread.run() - end"); } } public class Threads { public static void main(String[] args) throws InterruptedException { // Вывести сообщение о том, что выполняется главный поток System.out.println("Main thread - begin"); // Создать экземпляр класса MyThread MyThread mt = new MyThread(); // Создать дочерний поток в главном потоке, // передать ему экземпляр mt Thread thr = new Thread(mt, "Thread - mt"); // Запустить поток методом start() thr.start(); // thr.run(); - так тоже можно запустить поток // Приостановить выполнение главного потока на 2 секунды Thread.sleep(2000); // Информировать о завершении главного потока System.out.println("Main thread - end"); } }
⇑
Связанные темы
- Многозадачность. Потоки выполнения. Основные понятия
- Средства Java для работы с потоками выполнения. Класс Thread. Интерфейс Runnable. Главный поток выполнения. Создание дочернего потока
- Методы класса Thread: join(), isAlive(), getPriority(), setPriority(). Примеры
- Примеры решения задач на потоки выполнения (Threads). Работа с файлами в потоках. Сортировка в потоках
⇑