我遇到一些不想启动的线程的问题。我有三节课。主要课程:
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");
}
}
}
当我运行它时,我希望t1
和t2
对象每秒打印一次消息,但只有t1
这样做; t2
不会打印任何内容。但是,如果我交换订单并在t2
之前实例化t1
,那么它们都会按预期开始打印。为什么会这样?
答案 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 temp
和T1
尚未作为主题启动。由于您已直接调用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方法。