Java 多线程优先级输出不清晰

Java 多线程优先级输出不清晰,java,multithreading,class,oop,Java,Multithreading,Class,Oop,我真的很困惑于多线程。我知道这些事实 “线程是不可预测的” 这个事实是否只适用于相同优先级的线程?如果没有,那么需要设置线程的优先级 我的意思是假设以下代码: public class Threadsync implements Runnable{ Thread t; String str; public Threadsync(String name) { this.str=name; this.t=new Thread(this,

我真的很困惑于多线程。我知道这些事实

线程是不可预测的

这个事实是否只适用于相同优先级的线程?如果没有,那么需要设置线程的优先级

我的意思是假设以下代码:

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 
    }
}
这是我的代码,我得到的输出是 你好,thread1 世界 你好,thread2

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

只有当您运行的线程超过CPU或操作系统的处理能力时,优先级才会出现,这样它们才能同时正常运行

如果使用Notify和Wait方法,那么等待优先级最高的线程将位于队列的前端


因此,使用优先级是有原因的,但是要注意,如果高优先级线程调用的方法太多,那么低优先级线程就有可能永远不会在队列中得到锁

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


简言之,设置线程的优先级并不能保证线程何时运行,也不能保证操作系统将如何对其进行优先级排序。即使操作系统向后解释线程优先级,代码也需要工作——也就是说,代码永远不应该假设线程优先级实际上意味着什么。C.f.

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

来自Java语言规范:

每个线程都有优先级。当存在加工竞争时 资源中,具有较高优先级的线程通常在 优先选择优先级较低的线程这种偏好不是, 但是,保证最高优先级的线程始终是 无法使用运行和线程优先级来可靠地实现 互斥


但是线程的正常优先级,
Thread.NORM\u priority
的值为
5
。根据我的几个测试,我注意到
5
1
之间的优先级设置与子线程一起工作,虽然它仍然让
主线程
先执行,因为
主线程的默认优先级为
5

如果在开始之前调用setPriority会发生什么?但测试起来很有趣:)为什么投反对票。。。如果你认为我在某件事上错了,请告诉我,如果操作系统决定,它什么时候开始起作用,而这不是Java定义的。@EJP是否意味着这句话错了“高优先级线程肯定比低优先级线程早执行”是和否是Java虚拟机决定了所有Java线程的时间片。@JeppeAndersen的意思是不可预测是我们作为开发人员唯一能说的关于线程执行顺序的事情伟大的我很乐意帮助仍然是操作系统只给Java虚拟机一个时间片给它的代码,然后它将运行它的threads@Tim布德劳苏我应该像在代码中浪费空间一样使用setPriority吗。如果你知道某些事情确实很重要,那么将其设置为高优先级(或相反)不会有什么坏处,但不要依赖于它实际决定执行顺序作为我的第二个输出。所以一定有一些逻辑如果你运行7个线程,并在每个线程中打印到屏幕上“Tread N:i=#”,其中N是线程数,i=#是FOR循环中从1到100000000的值,你会发现没有逻辑,我想您可以看到优先级在这种情况下确实有效——如果您将输出打印到fileyes。我这么说是因为我以为你们在寻找我们可以优先考虑子线程而不是主线程的地方。很抱歉,我的措辞有误导性。