我正在做一篇Java过去的考试试卷,我对以下问题感到困惑:
问:关于以下申请,哪一项陈述总是正确的?
class HiPri extends Thread {
HiPri() {
setPriority(10);
}
public void run() {
System.out.println(“Another thread starting up.”);
while (true) { }
}
public static void main(String args[]) {
HiPri hp1 = new HiPri();
HiPri hp2 = new HiPri();
HiPri hp3 = new HiPri();
hp1.start();
hp2.start();
hp3.start();
}
}
一个。运行应用程序时,将执行线程hp1;线程hp2和hp3永远不会得到 CPU。
B中。当应用程序运行时,线程hp1将执行完成,线程hp2将执行完成,然后线程hp3将执行完成。
℃。当应用程序运行时,所有三个线程(hp1,hp2和hp3)将同时执行,在CPU中进行时间切片。
d。在所有情况下都不能保证上述情况都不会发生。
我选择D,因为我认为B和C都是可能的,但不能保证会发生。关键答案是C。我在这里遗失了什么吗?有人可以请我澄清一下吗?非常感谢。
答案 0 :(得分:1)
B是不可能的,因为每个线程必须做的工作量是无限的。
然而,要真正迂腐,该程序不是合法的Java,因为它包含unreachable statements。所以人们可以争辩说它可以做任何事情。
答案 1 :(得分:1)
对我而言,关键在于答案A和B的措辞
... hp2和hp3将从不获取CPU。
似乎如果你同意所有线程都将启动,那么这是一个无效的答案,因为所有线程都至少收到了一些CPU。
...将执行完成......
while (true) {}
将永远循环,这显然是错误的。
通过消除过程,只回答'C'是有意义的。
编辑: 正如其他一些评论中所述,答案A取决于是否采用先发制人多线程。
答案 2 :(得分:1)
检查the docs。所有3种方法都会立即返回并启动一个新的Thread
,由于while(true)
方法正文中的run()
循环,它会无限执行。
public void start()
使该线程开始执行; Java虚拟机调用此线程的run方法。
结果是两个线程同时运行:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。
不止一次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。
答案 3 :(得分:0)
选项中你最好的答案应该是:
℃。运行应用程序时,所有三个线程(hp1,hp2和hp3) 将同时执行,在CPU中进行时间切片。
但线程调度在不同平台上有所不同,取决于JVM的实现。
的好文章干杯!!
答案 4 :(得分:0)
你是对的。 D是正确的,C是错误的。 JLS说:
“可以通过使用许多硬件处理器,通过对单个硬件处理器进行时间切片,或通过对许多硬件处理器进行时间切片来支持线程。”
因此时间切片不是强制性的,也不是单个(“the”)CPU。所以没有依赖两者的答案可能是正确的。