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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
同样的程序每次运行的时间不一样
最近在MFC开发过程中,遇到一个问题,即运行一段程序需要对其进行计时,不能保证每个同时开始的程序或者说是每个同时开始的线程同时结束。测试的时候,为了找到原因,我让线程上跑的程序时间复杂度都保持一致,且未设置优先级,然而同时开始却依旧不能同时结束,或者说差距比较小的同时结束。最后我尝试了一种更加极端的测试,即同一段程序让其运行,看看运行时间是否一致,为了保证测试的精度,我定时器选择的是QueryPe
solr入门之多线程默认查询solr库的返回结果不一致问题
今天遇到了个问题 项目中的solr的索引建立需要去查询另外一个solr的库来得到数据源 我是使用多线程默认的score排序来做的 期间多次发现查询的结果顺序不一致 刚刚开始以为是多线程操作变量导致 后来加入线程锁,现象已经存在 然后使用debug来调试,最后锁定查询solr库这个地方 发现根本就是查询的结果就是这个样子. 这里就不能使用默认的score来进行排序了. 选取一个能够
为什么多次调用同一个对象的HashCode方法返回不一样
public class HashCodeDemo  { public static void main(String[] args)  { Person p = new Person(); System.out.println(p.hashCode()); Person p2 = p; System.out.println(p2.hashCode()); String str
三个线程轮流执行顺序打印ABC(一):使用Semaphore实现
需求:有三个线程轮流执行,第一个线程打印A,第二个线程打印B,第三个线程打印C……循环10次。思路:三个线程对应三个Semaphore,三个Semaphore维护一个Permit。当前线程通过对应的Semaphore获取Permit,执行打印,并通过下一个线程对应的Semaphore释放Permit。类似于Permit在当前的线程对应的Semaphore中,传递到了下一个线程对应的Semaphore
顺序打印ABC------java多线程的一道经典面试题
这是迅雷的一道面试题,顺序打印ABC十次。 源代码如下 public class PrintABC { public static Boolean isThreadA = true; public static Boolean isThreadB = false; public static Boolean isThreadC = false; public static void
junit执行顺序
Junit 4.11里增加了指定测试方法执行顺序的特性 测试类的执行顺序可通过对测试类添加注解 “@FixMethodOrder(value)” 来指定,其中value 为执行顺序 三种执行顺序可供选择:默认(MethodSorters.DEFAULT),按方法名(MethodSorters.NAME_ASCENDING)和JVM(MethodSorters.JVM) 当没有指定
java多线程面试题,三个线程顺序打印ABC
package com.jinyi.medical.unsynch;import java.util.concurrent.TimeUnit; public class Test_ssss implements Runnable{ private String name; private Object pre; private Object self; public Te
一道面试题:多个线程按顺序输出
题目:编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC……      解题源码:package concurrent;import java.util.concurrent.locks.Condition; import java.util.concurrent.lock
有趣的加密算法------每次加密后的数据都不一样
最近, 碰到这样一个实际问题, 对同一个串采用同一个加密算法, 每次的结果都不一样, 但解密后, 又都能正确还原, 挺有意思的。        这是个封装了的加密算法, 我没有直接去看内部实现的源码, 但如上特性是很好实现的, 我也想到了实现方法。        有兴趣的朋友可以想一下, 怎么实现如上特性。
多线程顺序打印0-100等问题
问题描述: 3个线程,顺序打印1-100,线程1打印123,线程2打印456,线程3打印789。。。以此类推package com.test;import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;/** * Created by yanwen.ayw on 2016/10/9. *