Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кпп.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
238.24 Кб
Скачать

2. Реализация интерфейса Runnable.

Класс находится в пакете java.lang.Runnable.

В общем случае реализация многопоточного приложения с помощью интерфейса Runnable основывается на том же классе Thread, однако доступ к нему мы получаем через класс – обертку, реализующий интерфейс Runnable. Общий каркас приложения:

 static class RunnableSample implements Runnable {

      public void run() {

          System.out.println("делаем что-то полезное");

      }

   }

 public static void main(String[] args) {

             RunnableSample rs1 = new RunnableSample();

          Thread t1 = new Thread(rs1);

          t1.start();

 

}

 Пример, который мы разбирали выше можно переделать под использование интерфейса Runnable следующим образом:

static class MyThread implements Runnable {

       private String str;

            MyThread(String s) {

               str = s;

       }

            public void run() {

           for(int i = 0; i < 10; i++) {

                         try {

                   Thread.sleep(5);

               } catch (InterruptedException e) {}

                         System.out.print(str + " ");

               }

           System.out.print(" ");

           System.out.print(" \n");

                     }

   }

 public static void main(String[] args) {

       

       new Thread(new MyThread("1"), "T1").start();

       new Thread(new MyThread("2"), "T1").start();

 

}

 Класс нашего потока почти не изменился за исключением того, что он теперь не расширяет класс Threads, а реализует интерфейс Runnable. Основные изменения коснулись способа создания класса. Теперь мы вначале создаем класс MyThread("1"), затем передаем экземпляр этого класса классу Thread вместе с именем потока, напоследок из класса Thread вызывается функция start().

Такая запись вполне правомерна, если учесть, что в классе Thread есть 8 конструкторов, каждый из которых принимает на вход разные аргументы:

 Thread();

Thread(Runnable  rn);

Thread(Runnable rn, String name);

Thread(String name);

Thread(ThreadGroup  group, Runnable rn, String name);

Thread(ThreadGroup  group, Runnable rn)

Thread(ThreadGroup  group, String name);

Thread(ThreadGroup  group, Runnable rn, String name, long stackSize);

 Как видите можно использовать любой по вашему выбору, в том числе и те, которые принимают на вход экземпляры класса, реализующего интерфейс Runnable.

Выбор между использованием класса Thread и интерфейса Runnable.

Преимуществом наследования класса Thread является полный доступ ко всем функциональным возможностям потока через набор методов класса. Главным недостатоком является само наследование. В java принята одиночная модель наследования, в том смысле, что можно наследовать только от одного класса. Это обстоятельство может стать проблемой при разработке программ промышленного уровня, в которых из – за обилия дополнительного функционала бизнес – логики, обычно требуется модель множественого наследования. Реализация интерфейса частично решает эту проблему, поскольку класс может реализовывать несколько интерфейсов одновременно. Таким образом, в этом смысле использование интерфейса Runnable будет предпочтительнее, хотя в силу наличия дополнительной прослойки в виде интерфейса Runnable, исчезает возможность прямого управления потоком из класса MyThread. Хотя это все относительные трудности благодаря наличию статических методов класса Thread. Например, метода currentThread(), возвращающего ссылку на текущий поток.

Поэтому однозначеного ответа о предпочтении того или другого способа не существует.

Обычно в реальных программах в зависимости от текущих задач и личных предпочтений программиста может использоваться и тот и другой. Обычно наследование класса Thread применяют тогда, когда необходимо создать пользовательский поток, расширяющий функциональность класса java.lang.Thread. Такое решение применяют при разработке системного ПО и различных серверов приложений. Интерфейс Runnable применяют в том случае, когда необходимо просто выполнить несколько задач, без необходимости внесения значительных изменений в сам механизм обработки многопоточности.