Потоки виконання. Методи класу Thread: getName(), run(), start(), 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). Робота з файлами в потоках. Сортування в потоках
⇑