-1

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

线程是不可预测的

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

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

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 
    }
}

这是我的代码,我得到的输出是 hello thread1 world hello thread2

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

4

4 回答 4

2

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

于 2013-10-14T17:50:55.660 回答
1

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

简而言之,设置线程的优先级并不能保证它何时运行或操作系统将如何实际确定它的优先级。即使操作系统向后解释您的线程优先级,您的代码也需要工作——也就是说,您的代码永远不应该假设线程优先级实际上意味着任何东西。参考 Effective Java 中的这个建议

于 2013-10-14T17:50:44.697 回答
1

来自 Java 语言规范:

每个线程都有一个优先级。当存在处理资源竞争时,优先级较高的线程通常优先于优先级较低的线程执行。然而,这种偏好并不能保证最高优先级的线程将始终运行,并且线程优先级不能用于可靠地实现互斥

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

于 2013-10-14T18:04:41.660 回答
0

只有当您运行的线程数超过 CPU 或操作系统可以处理的线程数时,优先级才会发挥作用,因此它们都可以同时正常运行。

如果您使用 Notify 和 Wait 方法,那么具有最高等待优先级的线程将排在队列的前面!

所以使用优先级是有原因的,但请注意,如果高优先级线程正在调用一个方法,那么较低的线程可能永远不会在队列中获得锁定。

于 2013-10-14T17:33:10.943 回答