class MultiThread
{
public static void main(String[] args)
{
MyThread mt=new MyThread(); mt.getThread().start();
mt.getThread().start();
mt.getThread().start();
mt.getThread().start();
while(true)
{
System.out.println("main:"+Thread.currentThread().getName());
}
}
}class MyThread 
{
int index=0;
private class InnerThread extends Thread
{
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName()+":"+index++);
}
}
}
Thread getThread()
{
return new InnerThread();
}}
看这个程序 孙鑫JAVA里运行出来的INDEX值是连续的,到我电脑上运行出来就是不连续的了,这个是对于4个线程是有4个INDEX值还是只有一个INDEX值的问题吧 难道JDK这部分改过了?

解决方案 »

  1.   

    不是这个意思 那只是线程的执行次序不同 如果是一个Index,那么不管你线程执行次序如何打印出的index值肯定是连续的 。
      

  2.   

    我的jdk版本是1.5.0_22,运行结果是连续的。你java -version看一下你的jdk版本是多少?
    我觉得是同个mt对象start的线程,应该是连续的。假如jdk真改了,也得通知啊?
      

  3.   

    main:main
    Thread-0:1
    Thread-0:5
    Thread-0:6
    Thread-0:7
    Thread-0:8
    Thread-0:9
    Thread-0:10
    Thread-0:11
    Thread-0:12
    Thread-0:13
    Thread-0:14
    Thread-0:15
    Thread-0:16
    Thread-0:17
    Thread-0:18
    Thread-0:19
    Thread-0:20
    Thread-2:2
    Thread-2:22
    Thread-2:23
    Thread-2:24
    Thread-2:25
    Thread-2:26
    Thread-2:27
    Thread-2:28
    Thread-2:29
    Thread-2:30
    Thread-2:31
    Thread-2:32
    Thread-2:33
    Thread-2:34
    Thread-2:35
    Thread-2:36
    Thread-2:37
    Thread-2:38
    Thread-2:39
    Thread-2:40
    Thread-2:41
    Thread-2:42
    Thread-2:43
    Thread-0:21
    Thread-0:45
    Thread-0:46
    Thread-0:47
    Thread-0:48
    main:main
    main:main
    main:main
    main:main
    main:main截选部分结果
      

  4.   

    并不是JDK版本的问题,只是CPU速度变快了,分配的时间有误差,index++完还没来得打印,其他的线程先+完打印了,不过这些线程确实是访问的同一个index资源。而孙鑫是连续的是因为他的机器太慢了,如果每打印一次都sleep一会就不会不连续了。
      

  5.   

    和JDK版本没有关系~
    是连续的
    看到的现象是CPU资源分配的问题
      

  6.   

    如果还不是很懂,再补充一下。就如10楼所说,一行代码会有很多操作在运行,每行打印语句完全有可能每个字母就是一个操作,而index++也是个操作,而这些操作执行完了,显示到屏幕上这又是一个操作,而就在index++完和显示到屏幕上这个操作中间,由于机器速度太快而且分配的时间又不可能绝对均匀,就拿我的CPU来说,每秒能打印10万行以上,而一个线程在index++和打印到屏幕上之间速度稍微稍微慢了那么几万分之一秒,就完全有可能被其他线程先打印出来了。
      

  7.   

    所以你仔细观察,不连续的地方都出现在线程切换的时候,这就是因为一个线程在index++和输出到屏幕之间被其他线程抢走,而且别人抢走后他自己又要再等下一个时间片打印。
      

  8.   


    恩 我知道了 关键是 CPU快了以后 时间片多了,然后一行代码假设有十个操作,第一个线程执行了5个以后,还没来得及打印,其他线程可能已经开始打印了,然后中间的index就出现了 夹断的结果 ,可能那个第一个index=1的时候就要在index=5的后面才能被打印出来了。但是同时我觉得 机器慢的话,也应该会出现这种现象啊
      

  9.   

    不一定是连续的,但四个线程肯定是访问的同一个index变量,这是忽用置疑的不连续可能有以下原因System.out.println(Thread.currentThread().getName()+":"+index++);其实上面的代码的执行步骤可以分成更细String s=Thread.currentThread().getName()+":";
    index++;
    s+=index;
    System.out.println(s);因为线程的时间片是随机的,又因为线程没有同步,所以线程执行间可以在以上步骤上的任何一步切换线程,这产生的后果可能是多种多样的,有兴趣的可以接着分析 
      

  10.   

    我也遇到过这个问题,当时我的解释是CPU双核的,所以每一个时间点运行的线程并不确定,比如两个线程,A线程运行到了10,轮到B线程可能就是15,这样一说我自己也有点糊涂了...
      

  11.   

    我脑子里也很混乱,其实我也有一点不理解,当结束程序时,很多情况下最后一条语句只打印出来一部分,比如想要打印Thread-1:1187408只打印出来了Thre,而在程序运行过程中就没有这种情况。呵呵,个人觉得研究这个也没什么用,还是不要深究了,真麻烦了。
    刚才为了观察方便,把打印的结果写进了一个文件里,结果写了30秒,文件变成700多兆,打印出了4000多万行,比较无语。
      

  12.   

    我要看这个帖子是不是每次都要找到它才行,你引用我的回复后,CSDN也没有提醒,这点有点不人性化啊,你觉得呢?
      

  13.   

    我要看这个帖子是不是每次都要找到它才行,你引用我的回复后,CSDN也没有提醒,这点有点不人性化啊,你觉得呢?