下面是我的类:目的测试线程的启动后的结果!public class MyRunnable implements Runnable { int a = 0; public void run() {
for (a = 0; a < 10; a++) {
 try {
 Thread.sleep(10);
 } catch (Exception e) {
 }
System.out.println(Thread.currentThread().getName() + "  " + a);
}
} public static void main(String args[]) {

Thread t1 = new Thread(mr); 
Thread t2 = new Thread(mr);
Thread t3 = new Thread(mr);
// Thread t4 = new Thread(mr);
t1.start();
t2.start();
t3.start();
        //      t4.start(); }
}下面的打印的结果:Thread-0  0
Thread-1  1
Thread-2  2
Thread-0  3
Thread-1  4
Thread-2  5
Thread-0  6
Thread-1  7
Thread-2  8
Thread-0  9
Thread-1  10
Thread-2  11
困惑之处: 我循环的是十次! 为什么线程会执行到  11  ?若把 t4 也启动 则会打印出:
Thread-0  0
Thread-1  1
Thread-2  2
Thread-3  3
Thread-0  4
Thread-1  5
Thread-2  6
Thread-3  7
Thread-0  8
Thread-1  9
Thread-2  10
Thread-3  11
Thread-0  12
很的困惑,为什么啊??希望高手指点!

解决方案 »

  1.   

    这是因为:int a 这个变量是四个线程共同使用的同一个。所以会有这样的奇怪结果。
      

  2.   

    Where is the definition of varialbe "mr"?
      

  3.   

    失误! mr 是这样定义的!MyRunnable mr = new MyRunnable();继续等待~~~......
      

  4.   

    这是因为:int a 这个变量是四个线程共同使用的同一个。a是一个临界区。所以真正的代码这样写是不对的。出现这样的结果可解释如下:
    当 Thread-0 打印出 9后,做a++,此时a=10。这时Thread-1得到CPU(它刚才是用sleep()睡觉的),打印出a即:
    Thread-1  10 ,然后做:a++,此时a=11。这时Thread-2得到CPU(它刚才是用sleep()睡觉的),打印出a即:
    Thread-2  11 ,然后做:a++,此时a=12。CPU这时返回到Thread-0,以后大家都结束了(因为:a>=10了。)
      

  5.   


    原来 大家一觉醒来都不理 For 循环了!