2013-10-03 2 views
0

создать анонимный класс и передать его в тему и когда я начинаю нить, она запускает свой собственный класс ..Анонимного класса Резьбонарезного

Может кто-нибудь объяснить, что происходит с объектом-р, который передается нить?

public class Interface1{ 
    public static void main(String[] args){ 
     Runnable r = new Runnable(){ 
      public void run(){ 
       System.out.println("Cat"); 
      } 
     }; 

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

     t.start(); 


    } 
} 
+0

Это напечатало бы «Собака», так как вы переопределили run() в Thread. –

+0

Он игнорируется, поскольку вы переопределили метод 'run()' –

ответ

6

При передаче Runnable в качестве аргумента конструктора к Thread, он устанавливает поле экземпляра с именем target, который обычно использует при start() с.

Но вы перекрываться Thread#run() который обычно

@Override 
public void run() { 
    if (target != null) { 
     target.run(); 
    } 
} 

с

public void run(){ 
    System.out.println("Dog"); 
} 

В анонимном классе вы создали.

Так ваш код работает вместо вместо выполнения target.run() где target ваш Runnable экземпляр.

0

Если вы видите код в Thread.java -

634  public void [More ...] run() { 
635   if (target != null) { 
    // target is runnable instance which initialized in constructor 
636    target.run(); 
637   } 
638  } 

Если передать работоспособный объект через конструктор, то он выполняет Но здесь переопределить метод запуска самого класса Thread в вашем анонимном внутреннем классе, так что выполняется перекрытый метод ,

0

Javadoc для Thread «s run метод говорит:

Если эта нить была построена с использованием отдельного объекта Runnable выполнения, то этот метод Runnable объекта run называется; в противном случае этот метод ничего не делает и возвращает.

Javadoc для start говорит, что он просто звонит run. Я не вижу ничего, что запускает объект Runnable. Поэтому я думаю, мы можем предположить, что единственный способ запустить ваш объект r - это метод run класса Thread. Однако вы его переопределили.

Если вы хотите, чтобы ваш метод наиважнейшая run также запустить r объект, попробуйте добавить это где-то в вашем run:

super.run(); 
0

Всякий раз, когда вы начинаете нить, функция запуска java.lang.Thread (в) называется , Если вы посмотрите на исходный код Thread.java, он сначала проверит цель, которая является Runnable, переданной в конструкторе класса Thread. Этот runnable - это не что иное, как ваш класс, который реализовал интерфейс Runnable и, таким образом, переопределил его функцию run().

С его запущенной функцией runnable теперь, которая используется, вы должны реализовать логику внутри своей runnable. Имейте в виду, что новый поток ОС будет запускаться только классом Thread, если target/runnable не равен null, иначе Thread.run() будет выполняться в том же потоке, что и вызывающий.

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