Первый подход приемлемый, но обескураженный. Второй работает, но сломан/трудно понять. Рассмотрим третий один:
class ServerRunnable implements Runnable {
public void run(){}
}
Runnable run = new ServerRunnable();
Thread serverThread = new Thread(run);
serverThread.start(); //#3
# 1
Это довольно распространенный подход - для того, чтобы создать новую тему вы просто подклассов его и вызывая start()
метод. Многие люди, в том числе и я, считают эту идиому плохой практикой - она необязательно связывает задачу (содержимое метода run()
) с потоком (Thread
класс).
# 2
Я никогда не видел такой код, и, хотя технически работает, я бы исправить это немедленно. Несмотря на то, что вы создаете экземпляр , вы передаете его в другой поток и начинаете его. Итак, зачем создавать первый поток на первом месте? Обратите внимание, что Thread
также реализует Runnable
, поэтому он технически работает, но действительно неудобен.
# 3
Так что я рекомендую? Внедрите интерфейс Runnable
, который не связан с потоком. Вы не можете выполнить запуститеRunnable
только в отдельном потоке, вам нужно явно создать этот поток. Но наличие raw Runnable
также позволяет вам легко переключаться с собственного потока на, например, пул потоков.
Технически вы можете продлить Thread
и поставить такой «runnable» в пуле потоков, но это действительно сложно понять, и вы также неоправданно носите Thread
багаж (это довольно большой класс).
Как рекомендовано в официальных источниках: http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html – madth3
Объяснение прекрасно и даже ссылка тоже. SO, всякий раз, когда я хочу создать поток для класса, Runnable - лучший вариант?
И поток должен использоваться для запуска Runnable Object. Правильно ли я понимаю? – sravanreddy001
@mrb: Да, вы правы. Ссылка, предоставленная * madth3 *, объясняет это довольно хорошо. –