不了解线程构造函数的输出顺序,启动和运行方法

时间:2015-05-02 06:19:58

标签: java multithreading java-threads

为什么这段代码总是打印出来?

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 个答案:

答案 0 :(得分:2)

这是因为Thread.start被覆盖并且实际上从未被调用过。尝试添加super.start();到MyTread.start

答案 1 :(得分:0)

首先,你还没有开始Thread,而是刚刚创建了一个扩展Thread的MyThread类的实例。

要启动方法,您需要从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)以满足多线程要求。