2013-10-14 2 views
0

Heres код о потоках ..... Я не знаю разницу между этими двумя операторами new().Не могли бы вы объяснить эту тему?

Runnable r=new Runnable() { 
    public void run() { 
    System.out.print("Cat"); 
    } 
    }; 

    Thread t=new Thread(r) { 
    public void run() { 
    System.out.println("Dog"); 
    } 
    }; 
    t.start(); 

Выход Собака Но почему и как?

+0

Вы не запускаете runnable – tom

ответ

3

Потому что вы переопределяете Thread#run(), поэтому этот метод в конечном итоге выполняется при запуске потока. По умолчанию Thread#run() делегирует переданному Runnable. Правило большого пальца: Либо укажите Runnable, либо переопределите Thread#run(), но не делайте того и другого!

+1

Фактически эмпирическое правило состоит в том, чтобы никогда не создавать подкласс потока для начала, редко есть причина для этого – Voo

+0

Согласовано, передача «Runnable» в «Thread» приводит к значительному очищению дизайн с точки зрения развязки. Но, к сожалению (возможно, по причинам, связанным с наследием) класс 'Thread' не является' final', как и должно быть. И на самом деле не следует использовать raw Thread вообще (за исключением изучения основ программирования потоков Java); Новая структура параллелизма Javas обеспечивает намного лучшие (и более безопасные) абстракции для многопоточного программирования. –

0

изменение:

Runnable r=new Runnable() { 
public void run() { 
System.out.print("Cat"); 
} 
}; 

Thread t=new Thread(r); 
t.start(); 

это должно напечатать «Cat»

1

В резьбе т, переопределить метод запуска работоспособных, которые передаются ему. Я думаю, именно поэтому, когда вы вызываете начало потока, который имеет runnable и его метод запуска не вызывается!

0

при создании объекта Thread, например t Вы переопределили метод run(). поэтому вызов t.start() будет выполнять переопределенный метод. Таким образом, выход Dog и не Cat

0

Изменить его:

new Thread(new Runnable() { 
    public void run() { 
     System.out.print("Cat"); 
    } 
}).start(); 

The Runnable интерфейс обеспечивает альтернативный метод с использованием класса Thread, за исключением случаев, в которых это не возможно, чтобы сделать ваш класс расширяет тему класс. Это происходит, когда наш класс, который мы хотим запустить в отдельном потоке, должен расширять другой класс. Поскольку нет множественного наследования, наш класс не может одновременно расширять класс Thread и другой. В этом случае ваш класс должен реализовать интерфейс Runnable.

1

В первом «новом» заявлении создается экземпляр Runnable, который позже переходит в поток, созданный вторым «новым» оператором. Вывод - это собака, как в вашем втором «новом» заявлении, где вы создаете Thread, вы также переопределяете метод run(), это должно иметь приоритет перед реализацией run() внутри Runnable, в котором вы проходили. Это означает ваша Runnable-реализация run(), которая печатает Cat, никогда не используется, только Thread() реализации (реализация) реализации Dog вызывается Thread.

0

Поскольку Runnable - это интерфейс, а Thread - это класс, существуют некоторые различия, связанные с тем, как JVM управляет ими.

-Если вы реализуете интерфейс Runnable, уникальный объект будет совместно использоваться потоками.

-Общая класс темы, каждый поток создаст объект.

В некоторых сценариях runnable будет потреблять меньше памяти, чем Thread. Кроме того, я думаю, что если вы расширяете класс, это потому, что вы хотите переопределить некоторые методы, поэтому с моей точки зрения, если вы не будете изменять какой-либо метод или поведение из класса Thread, вы должны использовать Runnable ..

Надеюсь, что это поможет.

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