我一直在为我的 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
,并且当正常运行类(class)时,这正是输出。
但是,调试时输出为 RunBeginEnd
。
可以公平地说,在正常执行下,输出总是是BeginRunEnd
,还是会因其他因素(例如新线程类重有多重/启动线程后需要多长时间才能加入它)?
您认为这是一道公平/准确的试题吗?
最佳答案
我认为 BeginRunEnd 比 RunBeginEnd 更有可能(我预计实际启动新线程的行为需要一段时间才能到达 run
方法,并且在大多数情况下第一个线程在它的时间片用完之前到达打印),但是在编程时假设这一点是完全不正确的。
一旦 start
被调用,您就应该将这两个线程视为完全独立的,直到它们通过 join
调用再次显式绑定(bind)在一起。从逻辑上讲,新线程可以在主线程打印“开始”之前一直运行到完成。
在我看来这是个糟糕的问题。
关于Java - Thread join() 和执行顺序 SCJP 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6874420/