2 sixping sixping 于 2016.04.18 21:34 提问

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

4个回答

qq_24334403
qq_24334403   2016.04.19 14:12
已采纳

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

sixping
sixping   2016.04.18 21:37

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

追问:

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

追答:

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

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

ljheee
ljheee   Rxr 2016.04.18 21:48

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

qq_24334403
qq_24334403   2016.04.19 14:14

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!