多线程共享数据

 多个线程行为一致共同操作一个数据,最经典的例子就是卖票

public class ShareData {
    private int num  =10;
    public synchronized void inc(){
        num++;
        System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
package com.example.threadTest;

/**
 * Description: hibernate
 * Created by lenovo on 2019/6/1 19:33
 */
public class Ticket implements Runnable{
    private ShareData shareData;

    public Ticket(ShareData shareData) {
        this.shareData = shareData;
    }

    public Ticket() {

    }

    @Override
    public void run() {
        for (int i=0;i<5;i++){
            shareData.inc();
        }
    }
    public static void main (String[] args){
        ShareData shareData = new ShareData();
        for (int i=0;i<4;i++){
          new Thread(new Ticket(shareData),"Thread"+i).start();
      }
    }


}

2.多个线程行为不一致,共同操作一个数据

如果每个线程执行的代码不同这个时候就需要调用不同的Runnable对象,有两种方法实现这个Runnable对象之间的数据共享

,将共享数据封装在另外一个对象中,然后将这些对象逐一传递给各个Runnable对象 ,每一个线程对共享数据的操作方法也分配到那个对象身上去完成,这样就容易实现针对

该数据进行的各个操作的互斥和通信。

哎,先看实现再看这个总结就会恍然大悟。

在共享数据的对象里面添加不同的实现方法

package com.example.demo1;

/**
 * Description: hibernate
 * Created by lenovo on 2019/6/1 19:57
 */
public class MyThread implements Runnable{
    private SharaData sharaData;
    public MyThread() {

    }

    public MyThread(SharaData sharaData) {
        this.sharaData = sharaData;
    }

    public static void main (String[] args){

        SharaData sharaData = new SharaData();
        for (int i=0;i<4;i++){
            if (i%2==0){
                new Thread(new MyThread(sharaData),"Thread"+i).start();
            }else{
                new Thread(new MyThreadDec(sharaData),"Thread"+i).start();
            }
        }
    }
    //封装共享数据类



    @Override
    public void run() {
    for (int i=0;i<5;i++){
        sharaData.inc();

    }
    }
}
//
package com.example.demo1;
/** * Description: hibernate * Created by lenovo on 2019/6/1 20:07 */ public class MyThreadDec implements Runnable{ //封装共享数据 private SharaData sharaData; public MyThreadDec(SharaData sharaData) { this.sharaData = sharaData; } @Override public void run() { for (int i=0;i<5;i++){ sharaData.dec(); } } }
//共享数据类
package com.example.demo1;
/** * Description: hibernate * Created by lenovo on 2019/6/1 19:57 */ public class SharaData { private int num =10; public synchronized void inc(){ num++; System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void dec(){ num++; System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }

第二种方法

将这些Runnable对象作为一个类中的内部类,共享数据作为这个外部类中的成员变量,你每一个线程对共享数据的操作方法也分配给外部类,、

以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法

package com.example.demo1;

/**
 * Description: hibernate
 * Created by lenovo on 2019/6/1 20:33
 */
public class Thread2 {
    public static void main (String[] args){
        final SharaData sharaData =  new SharaData();
       for (int i=0;i<4;i++){
           if (i%2==0){
               new Thread(new Runnable() {
                   @Override
                   public void run() {
                       for (int i=0;i<5;i++){
                           sharaData.inc();
                       }
                   }
               },"Thread"+i).start();
           }else{
                 new Thread(new Runnable() {
                     @Override
                     public void run() {
                         for (int i=0;i<5;i++){
                             sharaData.dec();
                         }
                     }
                 },"Thread"+i).start();
           }
       }
    }

}

猜你喜欢

转载自www.cnblogs.com/zhulina-917/p/10960888.html