2012-01-16 4 views
0

Выход: RunnableA ThreadB
Я не понимаю, как это получается? (Что происходит в методе выполнения в классе B)метод запуска в классе Thread

class A implements Runnable{ 
    public void run(){ 
     System.out.println("RunnableA"); 
    } 
} 
class B extends Thread{ 
    B(Runnable r){ 
     super(r); 
    } 
    public void run(){ 
     super.run(); 
     System.out.println("ThreadB"); 
    } 
} 
class Demo{ 
    public static void main (String []args){ 
     A a=new A(); 
     Thread t=new B(a); 
     t.run(); 
    } 
} 

ответ

1

См внимательно реализацию метода выполнения класса Thread его как под:

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

Так вызывая метод запуска Нитей вызывает прогон Runnable, который передается, в вашем случае, если вы проходили экземпляр A при создании Thread t. Поэтому вызов super.run() вызывает метод run класса Thread, который поочередно вызывает метод запуска A (который является runnable или target).

3

Как вы называете super.run() в B#run он будет выполнять Thread#run и следующий run метод экземпляра Runnable переданных в конструктор будет выполнено.

1

Потому что у вас есть подкласс B и переопределен его метод run().

Сначала он вызовет метод B.

и в Brun() это найти супер вызов, так что вызывает super' s run() (который будет выполнять предоставленный Runnable 's run()) первым, а затем выполнить B' s run()

2

Thread.run просто вызывает run который вы дали вам. Но вы НИКОГДА не должны звонить Thread.run, вместо этого звоните Thread.start.

0

Когда вы создали объект класса B и передали ему a, был вызван конструктор класса b .Whats в конструкторе B? super (r); это устанавливает r для супервызов. Теперь, когда вы говорите t.run(), он вызывает переопределенный метод класса B, который вызывает метод run объекта, с которым вы связали super, с помощью функции super (r). Так как метод запуска a называется первым и затем печатается «ThreadB».