JavaSE中多线程案例1(关于对象锁)

案例要求:

某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程,
并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下:
编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
//.....
从后门入场的员工总共: 13 位员工

从前门入场的员工总共: 87 位员工

/*
 * 定义员工Employee共享数据为进入年会的员工个数
 */
public class Employee {
	public int num = 1;
}
/*
 * 前门线程
 * 为了保证不同线程任务在操作共享数据时没有安全隐患,需要:
 * 在ComMeeting测试类中创建唯一一个Employee对象,并将这个对象作为参数传入本前门线程类的构造器
 * 将这个对象作为同步构造器中的锁对象
 */
public class FDoor implements Runnable{
	private Employee e;
	public int count = 0;
	private boolean b = false;
	public FDoor(Employee e) {
		super();
		this.e = e;
	}
	private Random ran = new Random();
	public void run() {
		while(true) {
				synchronized(e) {
					if(e.num <= 100) {
						ArrayList<Integer> arr = new ArrayList<Integer>();
						while(arr.size() < 7) {
							int ballNum = ran.nextInt(33) + 1;
							if(!arr.contains(ballNum)) {
								arr.add(ballNum);
							}
						}
						System.out.print("编号为: " + e.num + "的员工从前门入场!拿到的双色球彩票号码是:");
						System.out.print("[");
						for(int i = 0; i < 7; i++) {
							if(i <= 5) {
								if(arr.get(i) < 10) {
									System.out.print("" + 0 + arr.get(i) + ",");
								}else {
									System.out.print(arr.get(i) + ",");
								}
							}else{
								if(arr.get(i) < 10) {
									System.out.println("" + 0 + arr.get(i) + "]");
								}else {
									System.out.println(arr.get(i) + "]");
								}
							}
						}
						count++;
						e.num++;
					}
				}
		}
	}
}
/*
 * 后门线程
 * 为了保证不同线程任务在操作共享数据时没有安全隐患,需要:
 * 在ComMeeting测试类中创建唯一一个Employee对象,并将这个对象作为参数传入本后门线程类的构造器
 * 将这个对象作为同步构造器中的锁对象
 */
public class BDoor implements Runnable{
	private Employee e;
	public int count = 0;
	public BDoor(Employee e) {
		super();
		this.e = e;
	}
	private Random ran = new Random();
	public void run() {
		while(true) {
				synchronized(e) {
					if(e.num <= 100) {
						ArrayList<Integer> arr = new ArrayList<Integer>();
						while(arr.size() < 7) {
							int ballNum = ran.nextInt(33) + 1;
							if(!arr.contains(ballNum)) {
								arr.add(ballNum);
							}
						}
						System.out.print("编号为: " + e.num + "的员工从后门入场!拿到的双色球彩票号码是:");
						System.out.print("[");
						for(int i = 0; i < 7; i++) {
							if(i <= 5) {
								if(arr.get(i) < 10) {
									System.out.print("" + 0 + arr.get(i) + ",");
								}else {
									System.out.print(arr.get(i) + ",");
								}
							}else {
								if(arr.get(i) < 10) {
									System.out.println("" + 0 + arr.get(i) + "]");
								}else {
									System.out.println(arr.get(i) + "]");
								}
							}
						}
						count++;
						e.num++;
					}
				}
		}
	}
}
/*
 * 年会线程,创建Runnable实现类对象,并创建两个线程,开启线程
 */
public class ComMeeting {
	public static void main(String[] args) {
		Employee e = new Employee();
		
		FDoor fd = new FDoor(e);
		BDoor bd = new BDoor(e);
		
		Thread tFD = new Thread(fd);
		Thread tBD = new Thread(bd);
		
		tFD.start();
		tBD.start();
		
		//让主线程“main”休眠1s,保证员工已经全部从前后门进入,再分别输出前后门进入的人数
		try {
			Thread.currentThread().sleep(1000);
		}catch(Exception ex) {
			
		}finally {
			System.out.println("从前门进入的员工总共: " + fd.count);
			System.out.println("从后门进入的员工总共: " + bd.count);
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值