2012-03-15 3 views
0

вывод этой программы происходит как «Inside Thread Inside Thread», как это происходит?объясняет вывод из нескольких потоков

class MyThread extends Thread 
{ 
    MyThread() {} 
    MyThread(Runnable r) {super(r); } 
    public void run() 
    { 
     System.out.print("Inside Thread "); 
    } 
} 
class MyRunnable implements Runnable 
{ 
    public void run() 
    { 
     System.out.print(" Inside Runnable"); 
    } 
} 
class ThreadRunnableBoth 
{ 
    public static void main(String[] args) 
    { 
     new MyThread().start(); 
     new MyThread(new MyRunnable()).start(); 
    } 
} 

Я могу понять, как первый «внутренняя резьба» печатает, но на второй раз распечатать я ожидал, чтобы напечатать «Inside Runnable», но он печатает «Inside тему», как это происходит? Пожалуйста, объясните ..... большое спасибо

ответ

1

Метод java.lang.Threadrun() просто вызывает target.run(), где target является Runnable при условии, во время строительства. Однако в MyThread вы переопределили эту функциональность; ваша версия run() игнорирует цель и вместо этого печатает «Inside Thread».

Один из способов исправить это запустить Runnable с экземпляром базового класса Thread:

new Thread(new MyRunnable()).start(); 

Другие возможности бы не переопределить run(), или вызвать super.run() от переопределения.

+0

Большое спасибо за ответы, я получил смысл сейчас ... – Jayesh

1

В вашем классе MyThread вы переопределяете метод run(). Это означает, что даже если вы передаете Runnable в конструктор, будет вызываться только ваш метод запуска, а цель Runnable будет проигнорирована.

Вот Thread.run() метода код, который вы переопределение:

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

Если вы хотите использовать свою работоспособным я сделаю:

new Thread(new MyRunnable()).start(); 

Это не используют MyThread класса.

0
new MyThread().start(); 

В этом случае поток создается вызовом метода Run() класса MyThread через MyThread() {} Constructer.

Во втором случае поток создается методом вызова run() того же класса MyThread через конструктор MyThread (Runnable).

1

Метод run в Thread определяется следующим образом:

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

Поскольку вы переопределены run в MyThread, он не будет на самом деле назвать свой MyRunnable.

Чтобы получить поведение вы ожидаете:

new MyThread().start(); 
new Thread(new MyRunnable()).start(); 
+0

Большое спасибо за объяснение – Jayesh

0

изменения второй вызов в теме:

new Thread(new MyRunnable()).start 

, потому что пользовательский поток переопределить метод запуска, который будет вызываться даже после того, как вы проходя ваш runnable to thread constructor.

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