При создании экземпляра Thread для создания объекта потока путем реализации интерфейса Runnable мы делаем что-то вроде
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
Ссылка: Учебник
Вопрос касается линии в методе main()
. Я понимаю, что start() - это метод экземпляра класса Thread, и именно поэтому мы используем (вновь созданный объект класса Thread with) точечной нотации.
Теперь я new Thread(new HelloRunnable())
вопросом о создании этого объекта Thread (созданного new Thread(new HelloRunnable())
). Почему мы передаем объект HelloRunnable (т.е. Класс, реализующий run() интерфейса Runnable) для конструктора, если Thread. Для чего нужен конструктор Thread() для объекта HelloRunnable? Каким будет использование конструктора Thread() для объекта HelloRunnable?
В общем случае задача конструктора Thread() заключается в создании объекта Thread. Итак, где конструктор Thread() использует объект класса, реализующего run(), создавая объект класса Thread.
Заранее спасибо.
Чтобы узнать, что делает конструктор в Java API, прочитайте javadoc (в любой хорошей среде IDE вы можете просто навести указатель мыши на новое выражение создания экземпляра класса, чтобы увидеть всплывающую подсказку с javadoc). Для конструктора Thread, использующего Runnable, он говорит:
Выделяет новый объект Thread. Этот конструктор имеет тот же эффект, что и Thread (null, target, gname), где gname - новое сгенерированное имя. Автоматически сгенерированные имена имеют форму "Thread-" +n, где n - целое число.
Параметры:
- target - объект, метод запуска которого вызывается при запуске этого потока. Если значение null, этот метод запуска классов ничего не делает.
Таким образом, объект Runnable предоставляет метод запуска для вызова. Если вы не передадите такой объект, нить не будет знать, какой класс содержит метод run (не говоря уже о том, как инициализировать этот объект).
"Объект реализации реализации класса" необходим, чтобы что-то было выполнено.
В противном случае какой код будет работать в потоке?
Вам не нужен только объект Runnable - альтернатива заключается в том, чтобы расширить Thread и переопределить метод Thread run.