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

      

  • 相关阅读:
    搭建家庭无线Adhoc网络
    IPv4到IPv6的过渡技术
    IPV6的安全性
    IPv6技术简要解析
    安全删除和恢复文件的脚本
    什么是 WPS(WiFi Protected Setup)
    华为:IPv6过渡技术中的探索
    IPV6地址设置及使用方法
    部分IIS日志参数名称解释
    《隐秘的角落》
  • 原文地址:https://www.cnblogs.com/E-star/p/3482170.html
Copyright © 2011-2022 走看看