Java: поток, вызывающий Runnable - PullRequest
4 голосов
/ 09 июля 2011

Я новичок в Java. Одно сомнение.

Я читал, что внутренне метод класса run() класса Thread вызывает run().

интерфейса Runnable.

Мой вопрос,

Как метод run() класса Thread вызывает run()?

интерфейса Runnable

заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 09 июля 2011

Интерфейс Runnable содержит только один метод: метод run(). Класс Thread на самом деле реализует интерфейс Runnable.

Следовательно, когда вы наследуете от класса Thread, ваш подкласс также реализует интерфейс Runnable.

Вот пример, как все это происходит:

  import java.applet.Applet;
     public class OurApplet extends Applet {
             public void init() {
                    Runnable ot = new OurClass();
                    Thread th = new Thread(ot);
                    th.start();
                      }
                 } 

Вызывается метод нового объекта start(), чтобы начать выполнение нового потока управления.

Причина, по которой нам нужно передать работающий объект в конструктор объекта потока, заключается в том, что поток должен иметь какой-то способ добраться до метода run(), который мы хотим, чтобы поток выполнялся. Поскольку мы больше не переопределяем метод run() класса Thread, выполняется метод по умолчанию run() класса Thread, этот метод run () по умолчанию выглядит следующим образом:

      public void run() {
            if (target != null) {
                target.run();
                  }
              }  

Здесь target - это исполняемый объект, который мы передали конструктору потока. Таким образом, поток начинает выполнение с run() метода класса Thread, который немедленно вызывает метод run() нашего запускаемого объекта.

0 голосов
/ 09 июля 2011

По сути, Thread реализует Runnable. Функция запуска потока вызывает метод запуска "target's" (где target реализует Runnable) (если он существует). Как показано в приведенном ниже коде, обычно вы устанавливаете целевой объект работоспособным при создании объекта Thread.

ПРИМЕЧАНИЕ. Runnable - это анонимный класс, не нужно углубляться в него, просто подумайте о нем как о подклассе Runnable.

Runnable run = new Runnable() { public void run() { /* code */ } }; // Create runnable
new Thread(run).start(); // Create thread and start the thread.
...