• 多线程之间共享数据的实现


    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);		
    	}
    }
    

      

  • 相关阅读:
    子组件 调用父组件方法
    加载进度条
    form 验证 自定义
    关于读取本地text文件,自动被添加空格的问题
    关于form表单中button按钮自动提交问题
    正态分布折线图/直方图相关方法以及概念
    大于0的数字(包含小数和整数)的正则表达式
    bigdecimal类型除法问题
    添加数据库的Maven依赖(SqlServer,Oracle)
    JS中null与undefined的区别
  • 原文地址:https://www.cnblogs.com/E-star/p/3482170.html
Copyright © 2020-2023  润新知