Главная страница

многопоточность джава. многопоточность. Класс Thread в java функциональность отдельного потока заключается в классе Thread


Скачать 340.19 Kb.
НазваниеКласс Thread в java функциональность отдельного потока заключается в классе Thread
Анкормногопоточность джава
Дата17.12.2021
Размер340.19 Kb.
Формат файлаdocx
Имя файламногопоточность.docx
ТипДокументы
#306823
страница2 из 6
1   2   3   4   5   6

Наследование от класса Thread


Создадим свой класс на основе Thread:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

class JThread extends Thread {

      

    JThread(String name){

        super(name);

    }

      

    public void run(){

          

        System.out.printf("%s started... \n", Thread.currentThread().getName());

        try{

            Thread.sleep(500);

        }

        catch(InterruptedException e){

            System.out.println("Thread has been interrupted");

        }

        System.out.printf("%s fiished... \n", Thread.currentThread().getName());

    }

}

  

public class Program {

  

    public static void main(String[] args) {

          

        System.out.println("Main thread started...");

        new JThread("JThread").start();

        System.out.println("Main thread finished...");

    }

}

Класс потока называется JThread. Предполагается, что в конструктор класса передается имя потока, которое затем передается в конструктор базового класса. В конструктор своего класса потока мы можем передать различные данные, но главное, чтобы в нем вызывался конструктор базового класса Thread, в который передается имя потока.

И также в JThread переопределяется метод run(), код которого собственно и будет представлять весь тот код, который выполняется в потоке.

В методе main для запуска потока JThread у него вызывается метод start(), после чего начинается выполнение того кода, который определен в методе run:

1

new JThread("JThread").start();

Консольный вывод:

Main thread started...

Main thread finished...

JThread started...

JThread finished...

Здесь в методе main в конструктор JThread передается произвольное название потока, и затем вызывается метод start(). По сути этот метод как раз и вызывает переопределенный метод run() класса JThread.

Обратите внимание, что главный поток завершает работу раньше, чем порожденный им дочерний поток JThread.

Аналогично созданию одного потока мы можем запускать сразу несколько потоков:

1

2

3

4

5

6

7

public static void main(String[] args) {

         

    System.out.println("Main thread started...");

    for(int i=1; i < 6; i++)

        new JThread("JThread " + i).start();

    System.out.println("Main thread finished...");

}

Консольный вывод:

Main thread started...

Main thread finished...

JThread 2 started...

JThread 5 started...

JThread 4 started...

JThread 1 started...

JThread 3 started...

JThread 1 finished...

JThread 2 finished...

JThread 5 finished...

JThread 4 finished...

JThread 3 finished...

Ожидание завершения потока


При запуске потоков в примерах выше Main thread завершался до дочернего потока. Как правило, более распространенной ситуацией является случай, когда Main thread завершается самым последним. Для этого надо применить метод join(). В этом случае текущий поток будет ожидать завершения потока, для которого вызван метод join:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public static void main(String[] args) {

         

    System.out.println("Main thread started...");

    JThread t= new JThread("JThread ");

    t.start();

    try{

        t.join();

    }

    catch(InterruptedException e){

     

        System.out.printf("%s has been interrupted", t.getName());

    }

    System.out.println("Main thread finished...");

}

Метод join() заставляет вызвавший поток (в данном случае Main thread) ожидать завершения вызываемого потока, для которого и применяется метод join (в данном случае JThread).

Консольный вывод:

Main thread started...

JThread started...

JThread finished...

Main thread finished...

Если в программе используется несколько дочерних потоков, и надо, чтобы Main thread завершался после дочерних, то для каждого дочернего потока надо вызвать метод join.
1   2   3   4   5   6


написать администратору сайта