如何确定Java线程行为

时间:2013-10-21 20:21:12

标签: java multithreading

我正在做一篇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。我在这里遗失了什么吗?有人可以请我澄清一下吗?非常感谢。

5 个答案:

答案 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的实现。

阅读Thread Scheduling

的好文章

干杯!!

答案 4 :(得分:0)

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

  

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

因此时间切片不是强制性的,也不是单个(“the”)CPU。所以没有依赖两者的答案可能是正确的。