Java - 无法启动runnable的线程

时间:2016-03-10 23:25:23

标签: java multithreading

我遇到一些不想启动的线程的问题。我有三节课。主要课程:

public class Main {
    public static void main(String[] args) {
        T1 t1 = new T1();
        T2 t2 = new T2();
    }
}

继承自Thread的类:

public class T1 extends Thread {
    public T1() {run();}
    public void run() {
        while (true) {
            try {Thread.sleep(1000);}
            catch (InterruptedException e) {e.printStackTrace();}
            System.out.println("Thread 1");         
        }
    }
}

实施Runnable的课程:

public class T2 implements Runnable {
    public T2() {new Thread(this).start();}
    public void run() {
        while (true) {
            try {Thread.sleep(1000);}
            catch (InterruptedException e) {e.printStackTrace();}
            System.out.println("Thread 2");
        }
    }
}

当我运行它时,我希望t1t2对象每秒打印一次消息,但只有t1这样做; t2不会打印任何内容。但是,如果我交换订单并在t2之前实例化t1,那么它们都会按预期开始打印。为什么会这样?

3 个答案:

答案 0 :(得分:2)

public T1() {run();}

你从未开始过线程;你刚刚直接调用run(),它在原始线程中永远运行。

答案 1 :(得分:0)

使用start()方法启动线程。所以你的主要看起来像

    T1 t1 = new T1();
    T2 t2 = new T2();
    t1.start();
    t2.start();

摆脱线程类中的构造函数。他们不应该启动线程。

答案 2 :(得分:0)

问题: int temp = a + mult(a, b - 1); return tempT1尚未作为主题启动。由于您已直接调用run()方法而不是start()方法,因此事情无法正常工作。

创建t1对象后,您在构造函数中调用T2方法,然后在无限run()循环中调用sleep()。尚未调用创建t2对象的下一个语句。

修复:删除while run()constructors的{​​{1}}来电,并在这两个主题上致电T1 and T2 classes

start()构造函数中,从

更改代码
T1

 public T1() {run();}

public T1() {} 构造函数的情况也是如此。如上所述,删除T2()方法。

更改主要方法
run()

public static void main(String[] args) {
    T1 t1 = new T1();
    T2 t2 = new T2();
}

阅读oracle documentation,了解如何启动线程。 run()方法应由java虚拟机调用,而不是由代码调用。您只需调用public static void main(String[] args) { T1 t1 = new T1(); t1.start(); T2 t2 = new T2(); t2.start(); } 方法,然后调用start()方法

run()
  

使该线程开始执行; Java虚拟机调用此线程的run方法。