Java 线程:最高优先级线程并不总是首先完成 A类扩展线程{ 公开募捐{ 对于(int i=1;i

Java 线程:最高优先级线程并不总是首先完成 A类扩展线程{ 公开募捐{ 对于(int i=1;i,java,multithreading,scheduler,thread-priority,Java,Multithreading,Scheduler,Thread Priority,这个程序我运行了好几次。 有时,具有最大优先级的线程“C”在最后一个线程完成 最大优先级是否不能确保它首先终止?我是说在其他线程退出循环之前? 如果不是,计划程序策略是什么 最大优先级是否不能确保它首先终止??,我的意思是在任何其他线程退出循环之前 不,这不能保证什么 如果不是,计划程序策略是什么 这是对操作系统的一个提示,如果您不是特权用户,可以随意忽略esp 即使它确实做了你建议的事情,过多地依赖它自己的行为也是个坏主意。i、 我会一直确保你的程序在没有它的情况下正常运行 如果希望线程C首先

这个程序我运行了好几次。 有时,具有最大优先级的线程“C”在最后一个线程完成 最大优先级是否不能确保它首先终止?我是说在其他线程退出循环之前? 如果不是,计划程序策略是什么

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

不,这不能保证什么

如果不是,计划程序策略是什么

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

即使它确实做了你建议的事情,过多地依赖它自己的行为也是个坏主意。i、 我会一直确保你的程序在没有它的情况下正常运行


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

线程的
优先级设置为
Max
并不能确保它将以最后一个结束。。它只是用作一个指示器,如果有时需要,那么应该选择这个线程而不是其他线程,假设CPU空闲,并且一些线程正在等待获取它。。因此,在这种情况下,如果考虑<代码>基于优先级的调度< /代码>,则具有最高优先级的线程将得到CPU肯定。


但是,如果您想确保线程C最后结束,您可以在该线程上调用一个方法来强制其他线程在线程C之后结束。。(但是,一个线程只能
在该线程已
生成的线程上加入
,因为它不会
引用从其他线程生成的另一个线程。)

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

线程。优先级只不过是对操作系统的一个建议。最终,操作系统做了它想做的事情。然而,我可以想象,如果你将迭代次数从5次增加到5000次,你会更经常地看到你想要的结果
是一种作弊的运行方式
c1.start();c1.连接();)我甚至不会称之为“作弊”,而是称之为“聪明”,因为开始和加入一个线程a)会让人困惑b)增加开销c)会让你看起来很傻。
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();
    }
}