我创建了一个使用线程的测试程序:
class First implements Runnable {
public void run() {
System.out.print("One ");
}
}
class Second implements Runnable {
Thread other;
Second(Thread t) {other = t;}
public void run() {
System.out.print("Two");
}
}
public class ThreadTest {
void go() {
First first = new First();
Thread t = new Thread(first);
Second second = new Second(t);
Thread u = new Thread(second);
t.start();
u.start();
}
public static void main(String[] args) {
new ThreadTest().go();
}
}
我预计它会打印出来:
一 一个
但我突然打印出来了:
一 两个
我不明白为什么会这样。我认为在两个线程中,必须调用First类中的方法run()
。因为我将First实例传递给Thread构造函数,然后将此创建的线程传递给Second构造函数。因此,来自First类的方法run()
优先于来自Second类的run()
方法。我哪里错了?
答案 0 :(得分:2)
第二个帖子没有理由打印"One"
。它可能引用了第一个Thread
,但它对它没有任何作用。没有任何内容覆盖Second
的{{1}}方法,因此它只会打印run
。
要制作第二个Two
打印Thread
,请One
调用其他run
的{{1}}方法。
Thread
但是,从另一个run
的{{1}}方法调用一个class Second implements Runnable {
Thread other;
Second(Thread t) {other = t;}
public void run() {
other.run();
}
}
的{{1}}方法是不常见的。事实上,直接致电Thread
是不寻常的。
答案 1 :(得分:1)
我预计它会打印出来:One One但它突然打印出来:One Two
你正在开始2个主题。 First.run()
方法打印出" One"。 Second.run()
方法打印出" Two"。仅仅因为您在other = t;
构造函数中分配Second
并未改变它的run()
方法。
因为我将First实例传递给了Thread构造函数,然后将这个创建的线程传递给Second构造函数。因此,First类的方法run()优先于Second类的run()方法。我哪里错了
也许在Second.run()
方法中,您打算致电other.run()
或其他什么?这将是一个奇怪的模式,但不建议这样做。你不应该像这样链接Thread
类。您应该传递First
方法,然后执行:
class Second implements Runnable {
First first;
Second(First first) { this.first = first; }
public void run() {
first.run();
}
}
但即便如此,从另一个方法调用一个run()
方法也是一种奇怪的模式。