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