Каква е разликата между двете нишки в кода по-долу:
public class MyThread extends Thread
{
int a=0;
public void run()
{
System.out.println("Some Thread");
}
public static void main(String[] args)
{
MyThread m=new MyThread();
Thread t=new Thread(m);
m.start(); //what is difference between this
t.start(); //and this
}
}
И двете ми дават същия резултат.
Отговори:
1 за отговор № 1Ако сте създали
Thread t = new Thread();
Тогава методът за изпълнение няма да направи нищо като Thread
Методът за изпълнение е
@Override
public void run() {
if (target != null) {
target.run();
}
}
където целта е нула. Ако преминете мишена
Thread t = new Thread(target)
след това нишката ще изпълни метода за изпълнение на целта.
Ако сте удължили MyThread
тогава run
метод в MyThread
ще изпълни
3 за отговор № 2
Примерът с нишката ще бъде от различен тип в двата случая - MyThread
срещу. Thread
- но run
Методът, който трябва да се изпълни, когато стартирате нишките, ще бъде същият.
Когато създавате a Thread
с new Thread(m)
, ти не трябва да минеш Thread
инстанция. Вие просто трябва да преминете един пример за прилагане на Runnable
интерфейс.
1 за отговор № 3
Това е в крайна сметка същото поведение.
Thread
сечива Runnable
и Thread
има конструктор, който приема a Runnable
, Следователно new Thread(m);
използва Runnable
прилагането на неговия аргумент. Но в крайна сметка същото run
използва метод, само Thread
случаите са различни.
1 за отговор № 4
Има няколко възможности за преминаванеИзпълняват се изпълнения към Thread и го стартират като Thread, но във вашия пример той използва само допълнително CPU време. Ще има смисъл да се използва в ситуация като тази по-долу.
class MyClass extends OtherClass implements Runnable { .. }
MyClass mm = new MyClass(..);
Thread t = new Thread(mm);
...
1 за отговор № 5
Когато предавате Runnable обект в конструктора Thread (r), Runnable става нишката делегат, Днес делегацията се счита за по-мощен и по-гъвкав начин за организиране на програма, отколкото наследяване. Това е особено вярно в Java, където няма множествено наследяване.
Когато давате на нишката делегат, делегатътсъщо може да наследи от някакъв друг клас (както е показано в user2794960 's пример) .Но ако направите "нишка" клас наследи от Thread, тогава той може да' t също наследи от всеки друг.
Знаете, че имате работа с делегацията, когато казвате Foo има Бар вместо да казва Foo е бар.