一个简单的多线程问题
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,以为刚开始的时候,他们等级是相同的,还有一个问题你机器是不是双核,如果是双核就会出现线程同时进行的问题,当然这并不能算做错误,只不过代码没有处理到这块,或者你手动指定所有线程等级.有更好方法的,大家也来讨论一下!