0

我正在做一份 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();
    }
}

A、应用程序运行时,线程hp1会执行;线程 hp2 和 hp3 永远不会获得 CPU。

B. 应用程序运行时,线程 hp1 执行完毕,线程 hp2 执行完毕,然后线程 hp3 执行完毕。

C. 当应用程序运行时,所有三个线程(hp1、hp2 和 hp3)将同时执行,在 CPU 中进行时间片轮换。

D. 上述任何一种情况都不能保证在所有情况下都会发生。

我选择 D,因为我认为 B 和 C 都是可能的,但不保证会发生。然而,关键答案是 C。我在这里遗漏了什么吗?谁能为我澄清一下?非常感谢。

4

5 回答 5

1

B 是不可能的,因为每个线程必须做的工作量是无限的。

然而,真正迂腐的是,该程序不是合法的 Java,因为它包含无法访问的语句。因此,人们可以争辩说它可以做任何事情。

于 2013-10-21T20:25:00.787 回答
1

检查文档。所有 3 个方法都立即返回并启动一个新的 ,由于方法体中的循环Thread,它无限执行。while(true)run()

公共无效开始()

使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

结果是两个线程同时运行:当前线程(从对 start 方法的调用返回)和另一个线程(执行其 run 方法)。

多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。

于 2013-10-21T20:32:55.983 回答
1

对我来说,关键在于答案 A 和 B 的措辞

... hp2 和 hp3永远无法获得 CPU。

似乎如果您同意所有线程都将启动,那么这是一个无效的答案,因为所有线程都至少获得了一些 CPU。

...将执行完成...

while (true) {}will 永远循环,这显然是错误的。

通过排除过程,只有答案“C”才有意义。

编辑: 正如在其他一些评论中所指出的,答案 A 将取决于一个人是否假设抢占式多线程。

于 2013-10-21T20:27:38.863 回答
0

在这些选项中,您最好的答案应该是:

C. 当应用程序运行时,所有三个线程(hp1、hp2 和 hp3)将同时执行,在 CPU 中进行时间片轮换。

但是线程调度在不同的平台上有所不同,并且取决于JVM的实现。

一篇关于线程调度的好文章

干杯!!

于 2013-10-21T20:43:02.413 回答
0

你是对的。D 正确,C 错误。JLS 说:

“可以通过拥有多个硬件处理器、对单个硬件处理器进行时间切片或对多个硬件处理器进行时间切片来支持线程。”

因此时间片不是强制性的,单个(“the”)CPU 也不是。因此,任何依赖于两者的答案都不可能是正确的。

于 2013-10-22T00:24:10.703 回答