多线程访问共享对象和数据的方式

如果每个线程执行相同的代码,比如售票案例,则可以使用一个Runnable对象,这个Runnable对象中有那个共享数据。

package Thread02;
public class MultiThreadShareData {
    static ShareData1 data1=new ShareData1();
    public static void main(String[] args) {
        new Thread(data1){

        }.start();
        new Thread(data1){

        }.start();
    }
}
//如果每个线程执行相同的代码,可以使用同过一个runnable对象,
//这个runnable对象中有那个共享数据,例如售票案例。
class ShareData1 implements Runnable{
    private int count=100;
    public void run() {
        while(count>0)
        {
            System.out.println(Thread.currentThread().getName()+"销售第"+count+"票!");
            count--;    
        }
    }
}

如果每个线程执行代码不同,这时候需要使用不同的Runnable对象,有如下两种方式来实现这些Runnable对象间的数据共享。
1、将共享数据封装在另外一个对象中,然后将这个对象逐一传递给每个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信
2、将这些Runnable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法。

package Thread02;
public class MultiThreadShareData {
    public static void main(String[] args) {
        final ShareData1 data1=new ShareData1();//把共享数据封装待data1里面
        new Thread(new MyRunnable1(data1)).start();//然后把这个对象传递给每个Runnable对象
        new Thread(new MyRunnable2(data1)).start();
    }
}
class MyRunnable1 implements Runnable{
    private ShareData1 data1;
    public MyRunnable1(ShareData1 data1){
        this.data1=data1;
    }
    @Override
    public void run() {
        while(true){
            data1.decrement();
        }
    }   
}
class MyRunnable2 implements Runnable{
    private ShareData1 data1;
    public MyRunnable2(ShareData1 data1){
        this.data1=data1;
    }
    @Override
    public void run() {
        while(true){
            data1.increment();
        }
    }   
}

class ShareData1{
    private int j=0;
    public synchronized void increment(){
            j++;
            System.out.println(Thread.currentThread().getName()+" : "+j);
    }
    public synchronized void decrement(){
            j--;
            System.out.println(Thread.currentThread().getName()+" : "+j);   
    }
}
package Thread02;
public class MultiThreadShareData {
    static ShareData1 data1=new ShareData1();//把共享数据作为外部类的成员变量
    public static void main(String[] args) {
        new Thread(new Runnable() {//把两个Runnable作为内部类
            @Override
            public void run() {
                while(true){
                    data1.decrement();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    data1.increment();
                }
            }
        }).start();
    }
}
class ShareData1{
    private int j=0;
    public synchronized void increment(){
            j++;
            System.out.println(Thread.currentThread().getName()+" : "+j);
    }
    public synchronized void decrement(){
            j--;
            System.out.println(Thread.currentThread().getName()+" : "+j);   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值