0

我创建了一个使用线程的测试程序:

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();
    }
}

我预计它将打印:

一一

但它突然为我打印了:

一二

我不明白为什么会这样。我认为在两个线程中,run()必须调用 First 类的方法。因为我将 First 实例传递给 Thread 构造函数,然后将此创建的线程传递给 Second 构造函数。所以run()第一类的方法优先run()于第二类的方法。我哪里错了?

4

2 回答 2

2

第二个线程没有理由打印"One"。它可能引用了 first Thread,但它没有做任何事情。没有任何东西会覆盖Second'srun方法,所以它只是打印Two.

要进行第二次Threadprint Onerun请调用 otherThreadrun方法。

class Second implements Runnable {
    Thread other;
    Second(Thread t) {other = t;}
    public void run() {
        other.run();
    }
}

但是从另一个方法调用一个方法是不寻常Thread的。事实上,直接调用是不寻常的。runrunThreadrun

于 2013-07-29T21:09:39.707 回答
1

我希望它会打印:一一但它突然对我来说打印了:一二

您正在启动 2 个线程。该First.run()方法打印出“一”。该Second.run()方法打印出“二”。other = t;仅仅因为你在构造函数中赋值Second并不会改变它的run()方法。

因为我将 First 实例传递给 Thread 构造函数,然后将此创建的线程传递给 Second 构造函数。所以 First class 的方法 run() 优先于 Second class 的 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()

于 2013-07-29T21:09:28.207 回答