我一直在为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
或者根据其他因素而变化(例如 >重新线程类是/在启动线程后加入它需要多长时间?)?
你会说这是一个公平/准确的考试题吗?
答案 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。