多线程优先级输出不清楚



我真的对多线程感到困惑。我知道这个事实

"线程是不可预测的"

这个事实只适用于线程的相同优先级吗?如果不是,那么设置线程优先级的必要性是什么。

我的意思是假设这段代码:

public class Threadsync implements Runnable{
    Thread t;
    String str;
    public Threadsync(String name)
    {
        this.str=name;
        this.t=new Thread(this,name);
        this.t.start();
        this.t.setPriority(10);
    }
    public void run()
    {
        System.out.println("hello "+str);
    }
    public static void main(String[] args)
    {
        new Threadsync("thread1");       //1
        new Threadsync("thread2");       //2
        System.out.println("world");     //3 
    }
}

这是我的代码,我得到了输出你好线程1世界你好线程2

线程

1 和线程 2 没有混淆,但为什么主线程输出消息world线程 2 输出消息之前hello thread2即使线程 2 的优先级几乎是主线程的两倍。提前谢谢.详细的解释将是非常可观的

线程是不可预测的,你在哪里说,你在哪里正确。除了你的小线程之外,JVM 还有很多问题需要处理。即使你给予优先权,你仍然无法知道会发生什么以及何时发生。如果您使用更多线程运行实验,要完成的处理更多,并且多次会看到......但即使你不可预测,它们仍然非常有用。

线程

何时运行实际上由操作系统的调度程序决定。 线程的优先级充其量是您给操作系统的建议 - 它可能使用也可能不使用的提示。 在 Linux 上很长一段时间,所有线程都以相同的优先级运行,无论以编程方式设置了什么优先级。

简而言之,设置线程的优先级并不能保证它何时运行或操作系统如何实际确定其优先级。 即使操作系统向后解释您的线程优先级,您的代码也需要工作 - 也就是说,您的代码永远不应该假设线程优先级实际上意味着什么。 C.f. 有效 Java 中的这个建议。

从 Java 语言规范:

每个线程都有一个优先级。当加工竞争激烈时 资源、优先级较高的线程一般在 优先选择优先级较低的线程。这种偏好不是, 但是,保证最高优先级线程将始终 正在运行,线程优先级不能用于可靠地实现 相互排斥

但是线程的正常优先级,Thread.NORM_PRIORITY的值为 5 。根据我的几次测试,我注意到 51 之间的优先级设置适用于子线程,尽管它仍然让Main thread首先执行Main因为线程具有优先级5默认值。

只有当您

运行的线程数超过您的 CPU 或操作系统可以处理的线程数时,优先级才会出现,因此它们同时正常运行。

如果您使用通知和等待方法,则具有最高优先级等待的线程将排在前面!

因此,使用优先级是有原因的,但请注意,如果高优先级线程调用方法,则较低的线程可能永远不会锁定在 que。

最新更新