因为多线程的程序并不能保证每个线程占用CPU资源的优先权,即使设定了优先权,也不能完全保证。

解决方案 »

  1.   

    1. 你的public void piggy(String sName)中将代入的sName指向新的字符串,本身的sName字符串并没有变,也就是说在run()中用的字符串还是原来的"vandeleur". 你是不是搞错了,用public void piggy()情况就不一样了.2. 当在piggy()调用start()后,就产生了一个新的线程,新的线程做FOR循环和主线程打印是两个不同的线程,具体先执行哪个是不定的.但是要看效果,需要加上延时,那时结果就不定了.
      

  2.   

    是啊,如果都不加延时,一般System.out.println(sName);在run()之前运行,所以是vandeleur。这道题目的出题目的还是很明确的,可以分别在main()函数和for()里加上不同的延时体会一下。(菜鸟之言)
      

  3.   

    谢谢上面各位网友的解答,我对这到题目是不是可以这样理解,在Java中参数是传递值的,
    public void piggy(String sName)方法中的sName其实是这个方法的局部变量,方法中对这个sName局部变量的修改不会影响到程序的全局变量sName。所以在main程序中的System.out.println(sName)一个可能性就是打印出了vandeleur。而在多线程的run方法中由于没有使用局部变量,它其中的变量sName应该就是程序声名的全局变量,run方法中对sName变量的修改会影响到System.out.println(sName)的打印结果。另外由于调用了start方法后,并不能保证线程可以马上运行,也有可能这个线程由于没有获得cpu的资源而没有运行,所以程序的线程可能不被运行。
    但是奇怪的是,线程要么得以运行,要么可能不被运行,除此之外可能在运行run方法中途停止的吗?好象应该不可能的把!那么这第四个答案也应该是不正确的。正确的答案应该是"vandeleur" or "vandaleur 0 1 2 3"
    各位你们看我这样的理解对吗?谢谢各为了,解决了马上给分!!!
      

  4.   

    你理解了宏观的线程,微观上Main的线程和Run的线程也是分时间片来获取Cup资源的,有的时候Main连续获得Cup(因为你的线程优先度一样)所以结果不确定,你可以用不同的优先度和利己线程试一下!
      

  5.   

    其实一个考虑的是String的调用,因为 wiggy是怎么都不可能加进去
    而线程执行的时候和System.out.println这条语句都在竞争sName这个资源,所以理所当让会出现上面4种情况
      

  6.   

    还是没能理解!
    “而线程执行的时候和System.out.println这条语句都在竞争sName这个资源,”但是一个线程开始于run方法,结束于run方法,我感到疑惑的是,在run方法中的for循环能中途退出吗?怎么说也应该0,1,2,3一起打印出来呀!能解释一下为什么是这样的吗?谢谢了!
      

  7.   

    C:\>f:F:\>cd workF:\work>javac  Tux.javaF:\work>java   Tux
    vandeleurF:\work>java   Tux
    vandeleurF:\work>javac  Tux.javaF:\work>java   Tux
    vandeleurF:\work>javac  Tux.javaF:\work>java   Tux
    vandeleurF:\work>我想那才是答案
      

  8.   

    “而线程执行的时候和System.out.println这条语句都在竞争sName这个资源,”但是一个线程开始于run方法,结束于run方法,我感到疑惑的是,在run方法中的for循环能中途退出吗?怎么说也应该0,1,2,3一起打印出来呀!能解释一下为什么是这样的吗?谢谢了!
    =====>
    你要注意,你调用的是start()方法,该方法会生成一个新的线程并执行run()方法,start()生成新的线程并调用run()后,不管该run()方法是否结束,它都会继续原来的进程(或线程). 在你的例子中,也就是在运行run()的同时可能System.out.println这条语句也在运行,结果就...
      

  9.   

    我知道了,是不是应该这样来理解,由于主线程和用start()方法起用的线程是同时运行的,而在主线程中的System.out.println(sName)可能在用start()方法起用的线程还没有运行完毕,但已经在这个线程运行结束前调用了,所以在线程运行中修改的变量结果可能会影响打印的结果。所以可能会出现答案中的四个结果。这样的理解应该对的把!!!