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

/**
* 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();
}

}


[url=http://down.51cto.com/data/443418]多个线程之间共享数据的方式探讨[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值