Потому что вы сказали, что ваш класс расширяетThread
, второй из них является избыточным. Во втором примере вы не используете свой класс как Thread
, вы просто используете его как Runnable
.
Обычно вы либо продлить Thread
, а затем вызвать его собственный start
(ваш # 1), или вы бы реализовать Runnable
, а затем использовать Thread
, чтобы запустить его (ваш 2 #). Но вы не должны распространять Thread
, а затем использовать другой Thread
для его запуска.
С точки зрения того, что по-другому, если вам нужно сделать что-нибудь, чтобы контролировать или опрашивать нить, в первом случае вы бы использовать Thread
методы на экземпляре вашего класса; во втором случае вы будете использовать их в экземпляре, создаваемом с помощью new Thread
. Если вы продляете Thread
, но запустите его через # 2, методы Thread
на вашем экземпляре не имеют значения и могут ввести в заблуждение.
Это последний бит, вероятно, яснее с примерами:
Пример расширения Thread
:
class Foo extends Thread {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Start it
foo.start();
// Wait for it to finish (for example)
foo.join();
Примечание мы начали и присоединился нить через foo
ссылки.
Пример реализации Runnable
:
class Foo implements Runnable {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Create a Thread to run it
Thread thread = new Thread(foo);
// Start it
thread.start();
// Wait for it to finish (for example)
thread.join();
Примечание мы начали и присоединился нить через thread
ссылки.
Не это сделать:
class Foo extends Thread {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Create a Thread to run it -- DON'T do this
Thread thread = new Thread(foo);
// Start it
thread.start();
... потому что теперь у вас есть Thread#join
доступны и foo
и thread
; который является правильным использовать? (Ответ: Один на thread
, но это сбивает с толку, так что лучше не делать этого.)
Java '' Thread' implements' 'Runnable', поэтому вы можете передать его в качестве ссылки на' Thread' , который принимает параметр «Runnable» в качестве параметра. В принципе, «Thread», когда выполняется, просто выполнит метод 'run'' Runnable', это пропуск. Если ни один не передан, он просто выполнит собственный метод 'run' ... – MadProgrammer
Возможный дубликат [" реализует Runnable "vs." extends Thread "] (http://stackoverflow.com/questions/541487/implements-runnable -vs-extends-thread) –