多个线程之间共享数据的方式探讨

/**
 * MultiThreadShareData.java
 * cn.com.songjy.test.socket.thread
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-17    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
 */

package cn.com.songjy.test.socket.thread;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:MultiThreadShareData
 * 多个线程之间共享数据的方式探讨
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-17 上午10:13:54
 */

public class MultiThreadShareData {
	
	private static Log log = LogFactory.getLog(MultiThreadShareData.class);
	
	private static int c = 5;//设定递增和递减的次数
	
	public static void main(String[] args) {

		/* 简单卖票模拟
		 * 
		 * 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个
		 * Runnable对象中有那个共享数据,卖票系统就可以这么做
		 * */
		SellTicket sell = new SellTicket();

		new Thread(sell).start();
		new Thread(sell).start();
		
		final InDe data02 = new InDe();

		/* 递增递减模拟一
		 * 
		 * 将共享数据封装在另一个对象中,然后将这个对象逐一传递给各个Runnable对象,
		 * 每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信
		 * */
		for(int i=0; i<c; i++)
		new Thread(new Runnable() {

			@Override
			public void run() {
				data02.increment();
			}
		}).start();

		for(int i=0; i<c; i++)
		new Thread(new Runnable() {

			@Override
			public void run() {
				data02.decrement();
			}
		}).start();
		
		/* 递增递减模拟二
		 * 
		 * 将共享数据封装在另一个对象中,每个线程对共享数据的操作方法也分配到那个对象身上去去完成,
		 * 对象作为这个外部类中的成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的成员内部类或局部内部类
		 * */
		
		for(int i=0; i<c; i++)
		new Thread(new MyRunnable01(data02)).start();
		for(int i=0; i<c; i++)
		new Thread(new MyRunnable02(data02)).start();
		
		try {
			Thread.sleep(2 * 1000l);
		} catch (InterruptedException e) {
			log.error(e.getMessage(), e);
		}
		
		log.info(data02.getJ());//等待所有线程结束后输出结果一定是0,否则线程不安全
	}
}

class SellTicket implements Runnable {
	
	private static Log log = LogFactory.getLog(SellTicket.class);

	private int count = 100;

	@Override
	public void run() {

		while (count>0) {
			log.info("售票窗口"+Thread.currentThread().getName()+"正在卖出一张票了,剩余票数:" + count);
			count--;
			log.info("售票窗口"+Thread.currentThread().getName()+"卖出一张票了,剩余票数:" + count);
		}
		
		log.info("所有票已售完");

	}
}

class InDe {

	private static Log log = LogFactory.getLog(InDe.class);
	private int j = 0;

	public int getJ() {
		return j;
	}

	public void setJ(int j) {
		this.j = j;
	}

	public void increment() {
		log.info(Thread.currentThread().getName()+"递增前结果:"+j);
		j++;
		log.info(Thread.currentThread().getName()+"递增后结果:"+j);
	}

	public void decrement() {
		log.info(Thread.currentThread().getName()+"递减前结果:"+j);
		j--;
		log.info(Thread.currentThread().getName()+"递减后结果:"+j);
	}
}

class MyRunnable01 implements Runnable{

	private InDe data;

	MyRunnable01(InDe data) {
		this.data = data;
	}
	
	@Override
	public void run() {
		data.increment();
	}
	
}

class MyRunnable02 implements Runnable{

	private InDe data;

	MyRunnable02(InDe data) {
		this.data = data;
	}
	
	@Override
	public void run() {
		data.decrement();
	}
	
}


多个线程之间共享数据的方式探讨

你可能感兴趣的:(thread,多线程,共享数据方式)