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");
  }
}

 


Связанные темы