zoukankan      html  css  js  c++  java
  • 多线程之间共享数据的实现

    1:
    如果每个线程执行的代码相同,可以使用同一个Runnable对象,然后将共享的数据放在Runnable里面,来实现数据的共享。 例如买票系统...

    package com.cn.gbx;
    
    import java.util.Date;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class TestThread {
    	
    	public static void main(String[] args) {
    		//共享数据放在了Count里面
    		Count count = new Count();
    		new Thread(count).start();
    		new Thread(count).start();
    	}
    }
    
    class Count implements Runnable{
        private int count = 10;
        //加互斥锁,来时实现同步
        private synchronized void decrement() {
        	count--;
        	System.out.println(Thread.currentThread().getName() + " : " + count);
        }
    	@Override
    	public void run() {
    		while (true) {
    			decrement();
    		}
    	}
    }
    

      

    2: 如果每个线程执行的代码不同, 那么就需要不同的Runnable对象,有两种方式事项这些Runnbale对象之间的数据共享
      a: 将共享数据封装在另一个对象中,然后实现不同的操作,然后将这个新对象传递给Runnable对象,每个线程对共享数据的操作也就相应的分配到了那个对象身上去完成。这样就能够实现对该数据的各种操作的互斥与通信

    package com.cn.gbx;
    
    import java.util.Date;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class TestThread {
    
    	public static void main(String[] args) {
    		ShareData count = new ShareData();
    		new Thread(new CountDec(count)).start();
    		new Thread(new CountInc(count)).start();
    	}
    }
    
    //将共享数据封装在另一个对象里面
    class ShareData {
    	private int count = 100;
    	public synchronized void decrement() {
    		count--;
    		System.out.println(Thread.currentThread().getName() + " :" + count);
    	}
    	public synchronized void increment() {
    		count++;
    		System.out.println(Thread.currentThread().getName() + " :" + count);		
    	}
    }
    
    //然后将新对象放入Runnable对象
    class CountDec implements Runnable {
    	private ShareData data = null;
    	public CountDec(ShareData data) {
    		this.data = data;
    	}
    	@Override
    	public void run() {
    		while (true) {
    			data.decrement();
    		}
    	}
    }
    class CountInc implements Runnable {
    	private ShareData data = null;
    	public CountInc(ShareData data) {
    		this.data = data;
    	}
    	@Override
    	public void run() {
    		while (true) {
    			data.increment();
    		}
    	}
    }
    

      

    b: 将这些Runnbale对象作为某一个类中的内部类,共享数据作为外部类的成员变量,每个线程对共享数据的操作也就分配给了外部类,以便实现共享数据的各种操作的互斥通信。

    package com.cn.gbx;
    
    import java.util.Date;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class TestThread {
    	//将共享数据作为外部类的成员变量
    	final private static ShareData data = new ShareData();
    	
    	public static void main(String[] args) {
    		//Runnbale内部类可以共享
    		new Thread(
    				new Runnable() {
    					
    					@Override
    					public void run() {
    						while (true) {
    							data.decrement();
    						}
    					}
    				}
    		).start();
    		new Thread(
    				new Runnable() {
    					@Override
    					public void run() {
    						while (true) {
    							data.increment();
    						}
    					}
    				}
    		).start();
    	}
    }
    
    //将共享数据封装在另一个对象里面
    class ShareData {
    	private int count = 100;
    	public synchronized void decrement() {
    		count--;
    		System.out.println(Thread.currentThread().getName() + " :" + count);
    	}
    	public synchronized void increment() {
    		count++;
    		System.out.println(Thread.currentThread().getName() + " :" + count);		
    	}
    }
    

      

  • 相关阅读:
    JQuery 获取touchstart,touchmove,touchend 坐标
    js获取可视区大小和页面大小的兼容性写法
    Asp.net MVC4.0自定义Html辅助方法
    无废话版本-Asp.net MVC4.0 Rasor的基本用法
    IE浏览器 下面的文本框,获得焦点后无法输入内容
    C# Log4Net配置
    C#中 ? 和?? 的用法
    工作中的一些问题总结
    JsRender系列-11
    JsRender系列demo-10
  • 原文地址:https://www.cnblogs.com/E-star/p/3482170.html
Copyright © 2011-2022 走看看