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

关于多线程的问题 就解答。。。。。。。。。。。。。。。。。。。。
用4个线程 2个让i++  另外2个让i--   打印出来 虽然最终结果是100  (i一开始等于100)  但是中间不明白的是 i=101 i=102...这样一直下去  换个线程打印的时候显示的是i=  差很远的数字。。  也就是说没有接着原来的数字加减。。  
下面是代码 本人初识多线程求大神们解答




public class test {

/**
 * @param args
 */
public static int i = 100;
public static void main(String[] args) {

testThread t1 = new testThread(1);
testThread t2 = new testThread(1);
testThread t3 = new testThread(0);
testThread t4 = new testThread(0);
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
new Thread(t4).start();
}

}

class testThread implements Runnable{
private int j;
public testThread(int j){
this.j=j;
}
public testThread(){}

public void run(){
int count = 50;
while(count>0){
if(j==1){
//add();
System.out.println("当前线程:"+Thread.currentThread().getName()+"增加票数至"+(++test.i)+"张");
}else if(j==0){
System.out.println("当前线程:"+Thread.currentThread().getName()+"减少票数至"+(--test.i)+"张");
//modfiy();
}
count--;

}
}
/*public synchronized  void add(){
System.out.println("当前线程:"+Thread.currentThread().getName()+"增加票数至"+(++test.i)+"张");
}
public synchronized  void modfiy(){
Syste*/
}
多线程 java

------解决方案--------------------
你无法控制这个程序运行的流程。线程是随机的,不知道哪个先运行了。
------解决方案--------------------

相差很远么?
可能是如此。
线程A 在打印的时候,正准备打印 i=100;
这个时候,线程B抢去了资源,让A没有打印。于是线程B就连续进行了20次相加。
结果最后打印出i=120;
这个时候,线程A再夺回执行权。
但是他打印的结果,却依然按照100进行打印。
但是如果A属于减的线程,那么下一条应该是打印出119.而不是99.

当然,线程具有一些不确定性,我也不了解,而且你这里有这么多,具体可能出现更加难以理解的情况吧。