首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2013-08-22 
多个线程之间共享数据的方式探讨/** * MultiThreadShareData.java * cn.com.songjy.test.socket.thread *

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

/** * 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() {@Overridepublic void run() {data02.increment();}}).start();for(int i=0; i<c; i++)new Thread(new Runnable() {@Overridepublic 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;@Overridepublic 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;}@Overridepublic void run() {data.increment();}}class MyRunnable02 implements Runnable{private InDe data;MyRunnable02(InDe data) {this.data = data;}@Overridepublic void run() {data.decrement();}}


引自
http://down.51cto.com/data/443418

热点排行