1
class A extends Thread {
    public void run() {
        for (int i = 1; i < 5; i++) {
            System.out.println("Thread A Loop NO " + i);

        }
        System.out.println("Exit from A");
    }
}

class B extends Thread {
    public void run() {
        for (int j = 1; j < 5; j++) {
            System.out.println("Thread B Loop no. " + j);
        }
        System.out.println("Exit from B");
    }
}

class C extends Thread {
    public void run() {
        for (int k = 1; k < 5; k++) {
            System.out.println("Thread C Loop no " + k);
        }
        System.out.println("Exit Form c");
    }
}

class Demo1 {
    public static void main(String args[]) {
        A a1 = new A();
        B b1 = new B();
        C c1 = new C();

        c1.setPriority(Thread.MAX_PRIORITY);
        a1.start();
        b1.start();
        c1.start();
    }
}  

我多次运行这个程序。有时具有最大优先级的线程“C”最后完成最大优先级是否不能确保它首先终止?我的意思是在任何其他线程退出循环之前?如果不是,调度程序策略是什么?

4

3 回答 3

3

最大优先级是否不能确保它首先终止????我的意思是在任何其他线程退出循环之前???

不,它不能确保任何事情。

如果不是,调度程序策略是什么???

它是对操作系统的提示,如果您不是特权用户,可以随意忽略 esp。

即使它确实按照您的建议行事,但过分依赖自己的行为也是一个坏主意。即,我将始终确保您的程序在没有它的情况下正常运行。

如果您希望线程 C 首先完成,您应该首先运行它,例如c1.run();

于 2012-10-02T11:12:13.990 回答
0

Thread's优先级设置为Max并不能确保它会在最后结束。它只是用作指示,应该选择该线程而不是其他线程,如果有时需要,假设 CPU 何时空闲,并且某些线程正在等待得到它。所以,在这种情况下,如果你考虑Priority based Scheduling,你的具有最高优先级的线程肯定会得到 CPU 。

但是,如果你想确保你的线程 C 最后结束,你可以在这个线程上调用一个Thread.join()方法来强制其他线程,end在线程 C 之后。(但是,一个线程只能join在那个线程上线程有spawned,因为它不需要reference从其他线程产生的其他线程。)

于 2012-10-02T11:21:26.167 回答
0

除了提出的其他要点之外,您的线程几乎什么都不做,除了在输出流上获取和释放锁。即使您只有一个 CPU,因此只有最高优先级的就绪线程可以运行,我怀疑您是否可以确定哪个线程将首先完成。更改优先级是一种优化,以改善过载盒子的某些方面的性能。它绝对不是任何一种同步机制,也不能用于将完全不工作的应用程序变成可以工作的应用程序。最好的说法是,它很可能使应用程序通过需求规范中的某个性能阈值。

于 2012-10-02T12:35:36.803 回答