日期:2014-05-20  浏览次数:20713 次

一个简单的多线程问题
public   class   ThreadTest   implements   Runnable   {
        int   a;
public   void   run()   {
              for(a=0;a <10;a++){
              try   {
Thread.sleep(100);
}   catch   (InterruptedException   e)   {
}
              System.out.println(Thread.currentThread().getName()   +   "   a= "   +   a);  
              }
}

public   static   void   main(String[]   args)   {
ThreadTest   run=new   ThreadTest();
                Thread   thread1=new   Thread(run);
                Thread   thread2=new   Thread(run);
                Thread   thread3=new   Thread(run);
                Thread   thread4=new   Thread(run);
                Thread   thread5=new   Thread(run);
                Thread   thread6=new   Thread(run);
                thread6.start();
                thread1.start();
                thread2.start();
                thread3.start();  
                thread4.start();
                thread5.start();

}
}
为什么会输出到a=14啊

------解决方案--------------------
多个线程共用同一个run指向的对象,当a=9的时候,循环结束,可能这个时候其他5个线程也运行到a=9,然后大家一起自加1,结果a一下子变成14了,当各个线程再次循环的时候,a已经14了,所以抛出异常,虚拟机终止运行。。
a可能的取值范围应该是[10,15]。一般13,14,15会多一些
------解决方案--------------------
这涉及到线程的并发和同步,除非你先控制了线程等级,第一线程+1,然后第二线程再+1,以为刚开始的时候,他们等级是相同的,还有一个问题你机器是不是双核,如果是双核就会出现线程同时进行的问题,当然这并不能算做错误,只不过代码没有处理到这块,或者你手动指定所有线程等级.有更好方法的,大家也来讨论一下!