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

解释一下 怎么两个线程会抢起来?
class ShareData{
public  String szData="";
}

class ThreadDemo extends Thread{
private ShareData oShare;

public ThreadDemo(String name,ShareData oShare){
super(name);
this.oShare=oShare;
}
 
public void run(){
for(int i=0;i<50;i++){
if(this.getName().equals("Thread 1")){
oShare.szData="这是第一个线程";
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(this.getName() + ":" + oShare.szData); 
}
else if(this.getName().equals("Thread 2")){
oShare.szData="这是第二个线程";
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(this.getName() + ":" + oShare.szData);
}
}
}
}

public class hello{
public static void main(String[] args){
ShareData oShare=new ShareData();
ThreadDemo t1=new ThreadDemo("Thread 1",oShare);
ThreadDemo t2=new ThreadDemo("Thread 2",oShare);
t1.start();
t2.start();
}
}
输出结果:
Thread 2:这是第二个线程
Thread 1:这是第二个线程
Thread 1:这是第二个线程
Thread 2:这是第一个线程
Thread 1:这是第二个线程
Thread 2:这是第一个线程
Thread 2:这是第二个线程
Thread 1:这是第二个线程
Thread 1:这是第一个线程
Thread 2:这是第一个线程
Thread 2:这是第一个线程
Thread 1:这是第一个线程
Thread 1:这是第二个线程
Thread 2:这是第二个线程
Thread 2:这是第二个线程
Thread 1:这是第二个线程
Thread 1:这是第二个线程
Thread 2:这是第二个线程
Thread 2:这是第二个线程
Thread 1:这是第二个线程
Thread 1:这是第二个线程
Thread 2:这是第一个线程
Thread 1:这是第二个线程
Thread 2:这是第一个线程
Thread 1:这是第二个线程



为什么会1 和2会抢起来?
有人说因为oShare是共有的
线程1有oShare 线程2有oShare 怎么会是共用的呢?


线程1 equals(Thread 1)后
不就设置它自己的szData是一叻吗?
线程2 equals(Thread 2)后
也是干同样的事情

两个线程应该毫不相干的啊0.0
------最佳解决方案--------------------
多个线程共享一个类中的成员变量啊,你使用的都是oShare这个对象,那么这个对象呗你的两个线程共享了,也就是两个线程都是用的这个变量,你的两个线程当然会乱,这个变量不是线程范围内的共享数据,你可以在两个线程中使用不同的对象,
------其他解决方案--------------------
ShareData oShare=new ShareData();       //生成oShare对象 
ThreadDemo t1=new ThreadDemo("Thread 1",oShare);   //生成线程1     
ThreadDemo t2=new ThreadDemo("Thread 2",oShare);   //生成线程2
线程的执行是没有先后顺序的,可以先执行线程1,也可以先执行线程2,也可能线程1执行到一半,线程2抢过来执行,就是跟运行结果一样。一不般情况下,只有1个主线程所以不会乱,现在多了2个线程(加上主线程共3个),程序也不知道先执行,所以结果肯定也都不一样
------其他解决方案--------------------
引用:
多个线程共享一个类中的成员变量啊,你使用的都是oShare这个对象,那么这个对象呗你的两个线程共享了,也就是两个线程都是用的这个变量,你的两个线程当然会乱,这个变量不是线程范围内的共享数据,你可以在两个线程中使用不同的对象,


是不是线程类比较特殊 只要放进去的是类的成员 就会被共享?