2012-03-10 2 views
4

В чем разница между двумя вызовами потоков ниже? Будут ли два вызова действовать аналогичным образом?Основы Java Threading

ПРИМЕЧАНИЕ: Я не использую # 1 & # 2 в то же время, что является лучшим вариантом.

private void startConnections(){ 
    ServerThread server = new ServerThread(); 
    server.start(); // #1 
    Thread serverThread = new Thread(server); 
    serverThread.start(); //#2 
} 

class ServerThread extends Thread{ 
    public void run(){} 
} 

ответ

9

Первый подход приемлемый, но обескураженный. Второй работает, но сломан/трудно понять. Рассмотрим третий один:

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 багаж (это довольно большой класс).

+1

Как рекомендовано в официальных источниках: http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html – madth3

+0

Объяснение прекрасно и даже ссылка тоже. SO, всякий раз, когда я хочу создать поток для класса, Runnable - лучший вариант?
И поток должен использоваться для запуска Runnable Object. Правильно ли я понимаю? – sravanreddy001

+0

@mrb: Да, вы правы. Ссылка, предоставленная * madth3 *, объясняет это довольно хорошо. –