多个线程访问共享对象和数据有很多方式,但是可以分为两大类:1.多线程执行代码相同的。2.多线程执行代码不同的
对于多线程执行代码相同的情况来说:
1)使用同一个Runnable对象,在new Thread的时候放入相同的这个对象
publicstaticvoidmain(String[]args){
Runnabler=newRunnable(){
intnum=100;
@Override
publicsynchronizedvoidrun(){
System.out.println(++num+"==add");
}
};
Threadt1=newThread(r);
Threadt2=newThread(r);
Threadt3=newThread(r);
t1.start();
t2.start();
t3.start();
}
对于多线程代码不同的情况来说:
1)将需要共享的对象或者数据放入另一个对象中,这个对象对外提供对其操作的方法,由不同的线程调用。
classNumber{
intnum=100;
publicintadd(){
return++num;
}
publicintdel(){
return--num;
}
}
Runnable对象中使用同一个Number对象
publicstaticvoidmain(String[]args){
finalNumbernum=newNumber();
RunnablerAdd=newRunnable(){
@Override
publicsynchronizedvoidrun(){
System.out.println(num.add()+"==add");
}
};
RunnablerDel=newRunnable(){
@Override
publicsynchronizedvoidrun(){
System.out.println(num.del()+"==del");
}
};
Threadt1=newThread(rAdd);
Threadt2=newThread(rDel);
Threadt3=newThread(rAdd);
t1.start();
t2.start();
t3.start();
}
2)将Runnable写成内部类的形式,然后将需要共享的对象和数据写成外部类的成员变量。
classNumber{
intnum=100;
Runnabler_add=newRunnable(){
@Override
publicsynchronizedvoidrun(){
System.out.println(++num+"==add");
}
};
Runnabler_del=newRunnable(){
@Override
publicsynchronizedvoidrun(){
System.out.println(--num+"==del");
}
};
}
然后通过调用Number对象中的内部类对象来实现。
publicstaticvoidmain(String[]args){
Numbern=newNumber();
Threadt1=newThread(n.r_add);
Threadt2=newThread(n.r_del);
t1.start();
t2.start();
}
------------------------------------------------------------------------------
还有一种方法简单粗暴,就是把需要共享的对象和数据用static修饰。