JAVA 基础 day-27 练习 线程与线程安全

  • 1.有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
        创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:
        
        抽奖箱1 又产生了一个 10 元大奖
        抽奖箱2 又产生了一个 100 元大奖   
package exrcise;

import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;

public class Test1 {

	/*
	 * 有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300}; 
	创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:
	
	抽奖箱1 又产生了一个 10 元大奖
	抽奖箱2 又产生了一个 100 元大奖	
	//.....
	 */
	public static void main(String[] args) {
		int[] arr = {10,5,20,50,100,200,500,800,2,80,300}; 
		ReentrantLock lock = new ReentrantLock();
		Lottery l = new Lottery(arr, lock);
		Thread t1 = new Thread(l);
		Thread t2 = new Thread(l);
		t1.setName("抽奖箱1");
		t2.setName("抽奖箱2");
		t1.start();
		t2.start();
	}
}

class Lottery implements Runnable{
	
	private int[] arr;
	private ReentrantLock lock;
	public Lottery() {
	}
	public Lottery(int[] arr, ReentrantLock lock) {
		this.arr = arr;
		this.lock = lock;
	}
	
	public void run() {
		Random ran = new Random();
		while(true) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			lock.lock();
			int ranInt = ran.nextInt(arr.length);
			System.out.println(Thread.currentThread().getName()	+ "又产生了一个" +ranInt+ "元大奖");
			lock.unlock();
		}

	}
	
}

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

import java.util.HashSet;
import java.util.Random;

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

	public static void main(String[] args) {
		Task task = new Task();
		Thread t1 = new Thread(task, "前门");
		Thread t2 = new Thread(task, "后门");
		t1.start();
		t2.start();
	}
}

class Task implements Runnable{
	private int employeeCount = 1;
	public int t1Count = 0;
	public int t2Count = 0;
	
	public void run() {
		while(true) {
			synchronized (this) {
				if(employeeCount == 100+1) {
					System.out.println("从前门入场的员工总共: " + t1Count + " 位员工");
					System.out.println("从后门入场的员工总共: " + t2Count + " 位员工");
					System.exit(0);
				}
				if(employeeCount < 100+1) {
					String threadNmae = Thread.currentThread().getName();
					if(threadNmae.equals("前门")) {
						t1Count++;
						System.out.println("编号为: " + (employeeCount++) +"的员工 从" + threadNmae + " 入场! 拿到的双色球彩票号码是: " + this.getLottery());
					}else if(threadNmae.equals("后门")){
						t2Count++;
						System.out.println("编号为: " + (employeeCount++) +"的员工 从" + threadNmae + " 入场! 拿到的双色球彩票号码是: " + this.getLottery());
					}
				}
			}
		}


	}
	
	private String getLottery() {
		int lotteryLength = 7;
		int maxInt = 32;
		HashSet<String> set = new HashSet<>();
		Random ran = new Random();
		while(set.size() < lotteryLength) {
			String str = String.valueOf(ran.nextInt(maxInt));
			if(str.length() == 1) {
				str = "0" + str;
			}
			set.add(str);
		}
		return set.toString();

	}
	
}



猜你喜欢

转载自blog.csdn.net/alexzt/article/details/80191695