Java - Thread join()和执行SCJP的顺序问题?

时间:2011-07-29 14:09:22

标签: java multithreading scjp

我一直在为O / SCJP考试做一些练习。请考虑以下代码:

public class Cruiser implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread a = new Thread(new Cruiser());
        a.start();

        System.out.print("Begin");
        a.join();
        System.out.print("End");
    }

    public void run() {
        System.out.print("Run");
    }
}

来源:http://scjptest.com/mock-test.xhtml

网站声明输出(模拟问题的答案)将为BeginRunEnd,并且在正常运行课程时,这正是输出的内容。

但是,调试输出时RunBeginEnd

公平地说,在正常执行下,输出始终BeginRunEnd或者根据其他因素而变化(例如 >重新线程类是/在启动线程后加入它需要多长时间?)?

你会说这是一个公平/准确的考试题吗?

3 个答案:

答案 0 :(得分:3)

我认为BeginRunEnd比RunBeginEnd更多可能(我希望实际启动新线程的行为需要一段时间才能进入run方法,并且在大多数情况下,在它的时间片用完之前获得打印的第一个线程),但在编程时它会变得不正确

一旦调用start,您应该将这两个线程视为完全独立,直到它们与join调用再次明确绑定在一起。从逻辑上讲,在主线程打印“Begin”之前,新线程可以一直运行完成。

对我来说,这似乎是一个糟糕的问题。

答案 1 :(得分:2)

这是一个垃圾问题。没有同步,结果是不确定的。

这真的是bofa fida SCJP问题,还是某个网站试图出售SCJP培训?如果是后者那么我会像瘟疫一样避开那个网站。

答案 2 :(得分:1)

这很可能取决于平台,但要显示订单可能会发生变化。

public class Cruiser implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread a = new Thread(new Cruiser());
        a.setPriority(Thread.MAX_PRIORITY);
        a.start();

        // Thread.sleep(1);

        System.out.print("Begin");
        a.join();
        System.out.print("End");
    }

    public void run() {
        System.out.print("Run");
    }
}
第一次运行时打印

RunBeginEnd

然而,之后它主要是BeginRunEnd

如果线程停止,即使是1 ms,它几乎每次都会产生RunBeginEnd。