如果每个线程执行的代码相同,可以使用同一个runnable对象,这个Runnable对象中有那个共享数据
比如卖票程序
每个线程访问的数据不同,将这个共享数据封在对象中,把这个对象
public class TheardTestController {
public static void main(String[] args) {
//卖票
Sale sale=new Sale();
new Thread(sale).start();
new Thread(sale).start();
//每个线程访问的数据不同 共享变量j 启动四个线程 两个操作j++ 两个操作j--
//思路是定义两个内部类实现runnable接口 共享外部类的成员变量
final Calculate c=new Calculate();//c对象为什么要用final修饰? 匿名内部类调用外部类的成员,外部类成员是以参数形式传入的
//在匿名类中需要传递进来final关键字,java希望的是保证内部实现和外在表现的一致性
//如果不将c设为final,就不会使得start()函数的局部变量和局部类内建立的拷贝保持一致
for(int i=0;i<2;i++){
new Thread(new Runnable() {
@Override
public void run() {
while(true){
c.add();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
c.reduce();
}
}
}).start();
}
}
}
class Calculate{
private int j=0;
public void add(){
j++;
System.out.println(Thread.currentThread().getName()+"add j="+j);
}
public void reduce(){
j--;
System.out.println(Thread.currentThread().getName()+"reduce j="+j);
}
}
class Sale implements Runnable{
private int count=100;
@Override
public void run() {
while(count>0){
count--;
System.out.println(Thread.currentThread().getName()+" count :"+count);
}
}
}