2015-05-02 1 views
1

Почему этот код всегда печатает это?Не понимаю порядок вывода конструктора потоков, методы запуска и запуска

in start oops 
in ctor oops 

И не вызывает run метод, даже если уже был запущен поток. когда поток запускается сначала методом запуска, а затем выполняется.

class MyThread extends Thread { 
    public MyThread(String name) { 
    this.setName(name); 
    start(); 
    System.out.println("in ctor " + getName()); 
    } 
    public void start() { 
    System.out.println("in start " + getName()); 
    } 
    public void run() { 
    System.out.println("in run " + getName()); 
    } 
} 


class Test { 

    public static void main(String []args) { 
      new MyThread("oops"); 
      } 
} 

ответ

2

Это потому, что Thread.start завышен и никогда не называется. Попробуйте добавить super.start(); to MyTread.start

0

Прежде всего, вы не запустили Thread как таковой, а вы только что создали экземпляр класса MyThread, который расширяет Thread.

Чтобы начать метод, вам необходимо вызвать метод start() из Thread класс. Здесь вы переопределили метод, но не вызвали фактический метод из суперкласса. Так что вам нужно, чтобы исправить это как:

public class Test { 
    public static void main(String[] args) { 
     Thread myThread = new MyThread("oops"); 
     myThread.start(); 
    } 
} 

class MyThread extends Thread { 
    public MyThread(String name) { 
     this.setName(name); 
     this.start(); 
     System.out.println("in ctor " + getName()); 
    } 
    public void start() { 
     super.start(); 
     System.out.println("in start " + getName()); 
    } 
    public void run() { 
     super.run(); 
     System.out.println("in run " + getName()); 
    } 
} 

На стороне записки вы всегда должны отдавать предпочтение реализации Runnable (или Callable) для требований многопоточности.