线程:最高优先级线程并不总是先完成

时间:2012-10-02 11:08:43

标签: java multithreading scheduler thread-priority

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”在最后完成 最高优先级不确保首先终止吗?我的意思是在任何其他线程退出循环之前? 如果不是什么是调度程序策略?

3 个答案:

答案 0 :(得分:3)

  

最高优先级是否确保它首先终止????,我的意思是任何其他线程退出循环???

不,它无法确保任何事情。

  

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

它提示操作系统,如果您不是特权用户,可以免费忽略esp。

即使它确实做了你认为过分依赖自己行为的坏主意。即如果没有它,我总是会确保你的程序正常运行。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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