2013-03-21 2 views
0

Есть ли разница междусоздание темы и начиная

class MyThread extends Thread 
{ 
} 

MyThread obj = new MyThread(); 
Thread t = new Thread(obj); 
t.start() 

Vs

obj.start() 

Есть ли какое-либо преимущество в выборе друга над другими?

+0

Резьба реализует Runnable – NilsH

+0

http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html –

ответ

1

Ваш объект уже расширяет Thread, поэтому нет необходимости обертывать его в новый объект Thread. Если бы вы использовали Runnable, то первый подход был бы правильным.

1

new Thread(obj)Thread.run до obj. Используется только obj как Runnable, а не как Thread.

MyRunnable obj = new MyRunnable(); 
Thread t = new Thread(obj); 
t.start(); 

С (в коде) вы инстанцировании две нити (один, который запускается, и один, который никогда не начал, вы платите определенную стоимость за создание дополнительного потока). Кроме того, форма с runnable приводит к лучшей конструкции, поскольку вы не расширяете Thread с единственной целью переопределения run.

Если бы вы реализовали свою логику с Runnable, вы могли бы использовать ThreadFactory, и вы бы не больше быть привязаны к реализации по умолчанию Thread (который поставляется удобно в некоторых ситуациях).

2

Thread t = new Thread(obj); принимает Runnable obj - рекомендуемый способ.

MyThread obj = new MyThread(); требует от вас extendThread, который считается нецелесообразной в настоящее время.

См. "implements Runnable" vs. "extends Thread" для получения более подробной информации о дебатах.

5

В общем, вы не должны распространять Thread, но вместо этого используйте Runnable. Ваш пример бы тогда:

class MyRunnable implements Runnable { 

    public void run() { 
     // Whatever needs to be done. 
    } 
} 

MyRunnable obj = new MyRunnable(); 
Thread t = new Thread(obj); 
t.start() 
3

Да, есть разница: вы должны не продлить Thread, но использовать new Thread(myRunnable). Это похоже на ваш первый подход, только ваш путь ошибочен в расширении Thread вместо внедрения Runnable. Так что это:

class MyRunnable implements Runnable { 
    public void run() { ... } 
} 

Thread t = new MyThread(new MyRunnable()); 
t.start(); 

или, что более удобно,

new Thread(new Runnable() { public void run() { 
    ... stuff ... 
}}).start(); 

Будьте уверены, чтобы различать понятия Thread и Runnable: бывший тяжелый вес ручки до фактического ресурса системы; последний является просто держателем метода.

1

Это кажется сбивающим с толку в лучшем случае.

Я предпочел бы реализовать интерфейс Runnable, а затем этот объект может быть доступен не только в Thread конструктор, но и пронизывать бассейны, исполнители и т.д., которые потребляют Runnable объектов для представления потоков в более поздние времена.

Смежные вопросы