java线程问题:为什么打印的结果每次不同?为什么执行的顺序不同?

求大神指教为什么每次打印的结果会不同?
原码贴上:
package com.Sixping.Ncre08;
public class TreadTest {
public static void main(String[] args) {
Thread t1 = new Thread(new Hello());
Thread t2 = new Thread(new Hello());
Thread t3 = new Thread(new Hello());
t1.start();
t2.start();
t3.start();
}
}
class Hello implements Runnable {
int i;
public void run() {
while (true) {
System.out.println("Hello " + i++);
// System.out.println("Hello "+(++i));
if (i == 5) {
break;
}
}
}
}

多个线程的时候,线程之间属于竞争状态,谁先抢到就运行一个时间片,然后到下一个时间片再抢,所以,结果不会唯一

首先说 线程优先级,并不能保证优先级高的先运行,也不保证优先级高的更多的分配CPU时间,只是对系统的建议而已,到底运行哪个,是操作系统决定的,都不是java说了算的。
另外java只能保证在线程内部看起来是顺序执行你的代码的,并不能保证从其他线程看来这个是按照你编码顺序执行的。。

追问:

  • -|||但至少几率应该大点儿吧。。。我运行了很多次。。。完全没发现有任何优先级体现出来啊。。。那优先级有啥意义呢?

追答:

根据java语言规范,程序的正确性和性能保障,不能依靠优先级。
要靠程序自己控制。
优先级这个东西一般在系统资源紧缺的情况下可能会比较明显。
你这个经过运行时优化之后,几乎没有什么了。
所以体现不出来。

-----------------------------------分割线---------------------------------------------
是这样的吗?

这种结果是正常的,结果基本是每次都不样,这就是Java多线程的特点,程序运行控制都是通过CPU调度,不会想单线程程序那样,顺序、确定性地执行代码。

你说的线程优先级是需要手动设置的,好像有10个级别?时间久远,记不清了