Есть ли разница междусоздание темы и начиная
class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
Vs
obj.start()
Есть ли какое-либо преимущество в выборе друга над другими?
Есть ли разница междусоздание темы и начиная
class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
Vs
obj.start()
Есть ли какое-либо преимущество в выборе друга над другими?
Ваш объект уже расширяет Thread, поэтому нет необходимости обертывать его в новый объект Thread. Если бы вы использовали Runnable, то первый подход был бы правильным.
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
(который поставляется удобно в некоторых ситуациях).
Thread t = new Thread(obj);
принимает Runnable obj
- рекомендуемый способ.
MyThread obj = new MyThread();
требует от вас extend
Thread
, который считается нецелесообразной в настоящее время.
См. "implements Runnable" vs. "extends Thread" для получения более подробной информации о дебатах.
В общем, вы не должны распространять 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()
Да, есть разница: вы должны не продлить 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
: бывший тяжелый вес ручки до фактического ресурса системы; последний является просто держателем метода.
Это кажется сбивающим с толку в лучшем случае.
Я предпочел бы реализовать интерфейс Runnable, а затем этот объект может быть доступен не только в Thread
конструктор, но и пронизывать бассейны, исполнители и т.д., которые потребляют Runnable
объектов для представления потоков в более поздние времена.
Резьба реализует Runnable – NilsH
http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html –