加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Java多个线程之间处理共享数据的办法

发布时间:2021-12-11 10:51:13 所属栏目:PHP教程 来源:互联网
导读:有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现? 分析: x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到窗口买票问题,但是卖票只是单纯的减。 所以,多个线程访问共享对象或数据的方式,先

有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现?
 
分析:
 
x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到“窗口买票问题”,但是卖票只是单纯的减。
 
所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题。
 
如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之间的数据共享:
 
第一种:将共享数据封装到一个对象中,把这个共享数据所在的对象传递给不同的Runnable,每个线程对共享数据的操作也分给那个
 
对象完成,这样就可以实现对该数据处理的互斥与通信。
 
class ShareData {
 private int x = 0;
 
 public synchronized void addx(){
 
   x++;
   System.out.println("x++ : "+x);
 
 }
 public synchronized void subx(){
 
   x--;
   System.out.println("x-- : "+x);
   
 }
}
class MyRunnable1 implements Runnable{
 private ShareData share1 = null;
 public MyRunnable1(ShareData share1) {
  this.share1 = share1;
 
 }
 public void run() {
  for(int i = 0;i<100;i++){
  share1.addx();
  }
 }
}
class MyRunnable2 implements Runnable{
 private ShareData share2 = null;
 public MyRunnable2(ShareData share2) {
  this.share2 = share2;
 
 }
 public void run() {
  for(int i = 0;i<100;i++){
  share2.subx();
  }
 }
}
public class ThreadsVisitData {
 
 
 public static void main(String[] args) {
  ShareData share = new ShareData();
  new Thread(new MyRunnable1(share)).start();
  new Thread(new MyRunnable2(share)).start();
 
 }
}
 
第二种:
 
将这些Runnable对象作为某一个类的内部类,共享的数据作为外部类的成员变量,对共享数据的操作分配给外部类的方法来完成,以此实现对操作共享数据的互斥和通信,作为内部类的Runnable来操作外部类的方法,实现对数据的操作
 
class ShareData {
 private int x = 0;
 
 public synchronized void addx(){
   x++;
   System.out.println("x++ : "+x);
 }
 public synchronized void subx(){
   x--;
   System.out.println("x-- : "+x);
 }
}
 
public class ThreadsVisitData {
 
  public static ShareData share = new ShareData();
 
 public static void main(String[] args) {
  //final ShareData share = new ShareData();
  new Thread(new Runnable() {
 
   public void run() {
    for(int i = 0;i<100;i++){
    share.addx();
    }
   }
   }).start();
  new Thread(new Runnable() {
 
    public void run() {
     for(int i = 0;i<100;i++){
     share.subx();
     }
    }
   }).start();
 }
}
 
总结:要同步互斥的代码任务最好将他们分别放在独立的方法中,这些方法再放在同一个类中,这样比较容易实现操作的同步和通信。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读