2015-02-22 2 views
-2

Я пытался выяснить причины выхода следующей программы Java:Неожиданный выход. Пожалуйста, объясните

public class Main { 
    public static void main(String args[]) { 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
     System.out.println("Implementation"); 
     } 
    }; 
    MyThread gaurav = new MyThread(r); 
    new Thread(r).start(); 
    gaurav.start(); 
    } 
} 

class MyThread extends Thread { 

    Runnable runnable; 
    public MyThread(Runnable r) { 
    runnable = r; 
    } 

    @Override 
    public void run() { 
    super.run(); 
    System.out.println("Thread"); 
    } 
} 

Выход для выше: «Реализация» с последующим «Тема» в следующей строке. Теперь проблема заключается в этом утверждении:

gaurav.start(); 

Как я прошел работоспособный г к MyThread, я думал, что г будет получить выполнены, следовательно, выходной сигнал будет «Реализация» для этого тоже. Но ясно, что я что-то упускаю. Также разница между утверждениями:

new Thread(r).start(); 
     gaurav.start(); 

для этого сценария было бы действительно полезно. Благодарю.

+2

Вы только помещаете 'runnable' в поле в' MyThread', нигде вы его не запускаете. Вот почему это не выводит ничего как часть 'MyThread'. Вы также не можете передавать «Runnable» в 'MyThread' в отношении вывода. –

+1

Спасибо, я понял. Но до сих пор не получилось объяснять, почему я получил голоса, даже когда я много раз пробовал этот вопрос перед публикацией здесь. –

+0

Сообщество stackoverflow @gauravjain собрало много таких «не тратьте время на чтение вопросов, читайте только те слова», и они предположили, что вы смущены порядком исполнения, и это было задано раньше. Они участвуют в гонках за получение ответа. – mostruash

ответ

1

Рассмотрим следующий пример:

public class Main { 
    public static void main(String args[]) { 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
     System.out.println("Implementation"); 
     } 
    }; 
    MyThread gaurav = new MyThread(r); 
    gaurav.start(); 
    } 
} 

class MyThread extends Thread { 

    Runnable runnable; 
    public MyThread(Runnable r) { 
    // calling Thread(Runnable r) constructor. 
    super(r); 
    // runnable isn't used anywhere. You can omit the following line. 
    runnable = r; 
    } 

    @Override 
    public void run() { 
    // First it will run whatever Runnable is given 
    // into Thread's constructor. 
    super.run(); 
    System.out.println("Thread"); 
    } 
} 

Выход:

Implementation 
Thread 

Я думаю, ваше замешательство приходит от вашего Runnable Поле в MyThread. Вы думаете, что, имея его там, вы каким-то образом переопределяете свой собственный runnable Thread, но вы этого не делаете. Если вы хотите это сделать, вы должны позвонить super(r) в свой конструктор.

0

метод запуска MyThread начнет метод выполнения потока, в котором у вас есть System.out.println("Thread");

Хотя new Thread(r).start(); будет работать System.out.println("Implementation");

Пришло исключительно планировщиком ОС, какой поток будет работать первым. Таким образом, вы можете увидеть результат, как:

Implementation 
Thread 

Или

Thread 
Implementation 
+1

Он просто спрашивает, почему оба потока не выдают 'Реализация'. Я не думаю, что он спрашивает о порядке исполнения. – mostruash

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