/**
* 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]