多线程共享数据
Posted zhulina-917
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程共享数据相关的知识,希望对你有一定的参考价值。
多个线程行为一致共同操作一个数据,最经典的例子就是卖票
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();
以上是关于多线程共享数据的主要内容,如果未能解决你的问题,请参考以下文章