我真的很困惑多线程。我知道这个事实
“线程无法预测”
这个事实是否仅适用于相同的线程优先级?如果没有,则需要设置线程的优先级。
我的意思是假设这段代码:
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的优先级几乎是主线程的两倍。
提前致谢 。详细解释将非常值得注意
答案 0 :(得分:2)
线程是无法预测的你在哪里说,你在哪里。 JVM在您的小线程旁边有许多问题需要处理。即使你优先考虑,你仍然不知道将会发生什么。什么时候。 如果您使用更多线程运行实验,需要执行更多处理,您将看到多次... 但即使你不可预测,他们仍然非常有用。
答案 1 :(得分:1)
当线程运行时实际上是由操作系统的调度程序决定的。线程的优先级最多是您给操作系统的 advice - 它可能会或可能不会使用的提示。在Linux上很长一段时间,所有线程都以相同的优先级运行,无论它是以编程方式设置的优先级。
简而言之,设置线程的优先级并不能保证它何时运行或操作系统如何实际优先级。即使操作系统向后解释您的线程优先级,您的代码也需要工作 - 也就是说,您的代码永远不应该假设线程优先级实际上意味着任何。 C.F. this advice in Effective Java
答案 2 :(得分:1)
来自Java语言规范:
每个帖子都有优先权。有竞争加工时 资源,具有较高优先级的线程通常在执行 对优先级较低的线程的偏好。 这种偏好不是, 但是,保证最高优先级的线程永远是 运行,并且线程优先级不能用于可靠地实现 互斥。
但是线程正常优先级,Thread.NORM_PRIORITY
的值为5
。根据我的几个测试,我注意到5
和1
之间的优先级设置适用于子线程,尽管它仍然允许Main thread
首先执行Main
线程优先级5
为默认值。
答案 3 :(得分:0)
当你运行的线程多于CPU或你的操作系统可以处理的线程时,我只能使用优先级,因此它们可以同时正常运行。
如果你使用Notify和Wait方法,那么等待最高优先级的线程将从que的前面进入!
因此有使用优先级的原因但要注意,如果高优先级的Thread正在调用方法,那么较低的线程永远不会锁定在que中。