62,615
社区成员
发帖
与我相关
我的任务
分享
import java.util.ArrayList;
/**
* @author ZhengYesheng
*/
public class ExchangeHome implements Runnable
{
public ExchangeHome()
{
userList = new ArrayList<User>();
User user;
for (int i = 0; i < USER_COUNT; i++)
{
user = new User(i);
userList.add(user);
}
}
//设置三个常量的目的是减小样本数,方便调试,正式版只需要将常量值修改为系统要求即可
/**
* 系统运行总时间,单位:秒
*/
public static int TOTAL_TIME = 30;
/**
* 每次交换的时间间隔,单位:秒
*/
public static int SPACE_TIME = 5;
/**
* 系统中的总人数
*/
public static int USER_COUNT = 10;
/**
* 当前时间,单位:秒
*/
private int curTime = 0;
/**
* 系统中全部用户的列表
*/
private ArrayList<User> userList;
public static void main(String[] args)
{
ExchangeHome home = new ExchangeHome();
new Thread(home).run();
System.out.println("---------- end ---------");
}
@Override
public void run()
{
while (curTime <=TOTAL_TIME)
{
try
{
User payer;
User receiver;
int receiverId;
System.out.println("---------- " + curTime + " ----------");
for (int i = 0; i < USER_COUNT; i++)
{
payer = userList.get(i);
//随机选取一个用户
receiverId = (int) Math.floor(Math.random() * (userList.size() - 1));
if (receiverId >= i)
{
//随机到当前用户或者之后的用户,将该ID加一,以保证不会给自己1元钱,并保证所有用户获得馈赠的概率相当
receiverId += 1;
}
receiver = userList.get(receiverId);
payer.give(receiver);
System.out.println(payer.getId() + "(" + payer.getMoney() + ") --> " + receiver.getId() + "("
+ receiver.getMoney() + ")");
}
Thread.sleep(SPACE_TIME * 1000);
curTime += SPACE_TIME;
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* @author ZhengYesheng
* 用户类
*/
class User
{
/**
* 用户的钱数
*/
private int money = 100;
/**
* 用户ID
*/
private int id;
public User(int id)
{
this.id = id;
}
/**
* 当前用户给目标用的一定数目的钱
* @param user
*/
public void give(User user)
{
// 这里应该考虑事务管理
this.pay(1);
user.receive(1);
}
/**
* 接收一定数目的钱
* @param v
*/
public void receive(int v)
{
money += v;
}
/**
* 支付一定数目的钱
* @param v
*/
public void pay(int v)
{
money -= v;
}
/**
* 获取用户当前持有的钱数
* @return
*/
public int getMoney()
{
return money;
}
/**
* 获取用户ID
* @return
*/
public int getId()
{
return id;
}
}