Java. Потоки виконання. Методи класу Thread

Потоки виконання. Методи класу 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");
  }
}

 


Зв’язані теми