用线程执行小程序时不清楚

时间:2013-07-29 21:06:43

标签: java multithreading runnable

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

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()方法。我哪里错了?

2 个答案:

答案 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()方法也是一种奇怪的模式。