Java 多线程练习
程序员文章站
2023-10-27 08:43:34
某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程,
并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下: ......
题目:某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程,
并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下:
编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
//.....
从后门入场的员工总共: 13 位员工
从前门入场的员工总共: 87 位员工
分析:两个入口对应两个线程,获取彩票的方法覆写runnable接口的run方法实现,我把这个实现了runnable接口的类称作paper类,里面用id字段记录员工编号,并提供get,set方法。设置第3个线程来作为随机控制100个员工进出哪个入口,因为是员工进入了入口,入口才相应彩票方法,所以我用了等待唤醒机制(这里要注意,这个等待唤醒机制必须要在同步块中,还要用同一把锁。)
代码:
class paper implements runnable { boolean bflag = false; private int id; public void setid(int id) { this.id = id; } public int getid() { return this.id; } public string position; private list<string> listposcount = new arraylist<string>(); private hashmap<integer, int[]> dic = new hashmap<integer, int[]>(); private list<integer> mylist = new arraylist<integer>(); private int[] getnumbers(int size) { int numbers[] = new int[size]; for (int i = 0; i < size;) { boolean flag = false; numbers[i] = (int) (math.random() * 100); for (int j = 0; j < i; j++) { if (numbers[j] == numbers[i]) { flag = true; break; } } if (flag == true) { continue; } i++; } return numbers; } @override public void run() { synchronized (this) { while (mylist.size() < 100) { while (!bflag) { try { this.wait(); } catch (interruptedexception e) { e.printstacktrace(); } } this.bflag = false; if (!mylist.contains(id)) { mylist.add(id); if (position == "qian门" || position == "后门") listposcount.add(position); int nums[] = getnumbers(7); dic.put(id, nums); system.out .println("编号为: " + id + " 的员工 从" + position + " 入场! 拿到的双色球彩票号码是:" + arrays.tostring(nums)); } else { } this.notifyall(); } int a = 0, b = 0; for (string str : listposcount) { if (str == "后门") a++; if (str == "qian门") b++; } system.out.println("从后门入场的员工总共:" + a + " 位员工"); system.out.println("从后门入场的员工总共:" + b + " 位员工"); } } }
//--------------------------------------------------------------------------------
//测试main函数
public class threadlearn2 {
public static void main(string[] args) {
paper p = new paper();
thread th1 = new thread(p);
thread th2 = new thread(p);
runnable run1 = new runnable() {
@override
public void run() {
synchronized (p) {
list<integer> list = new arraylist<integer>();
while (list.size() < 100) {
int i = (int) (math.random() * 100);
if (list.indexof(i) == -1) {
p.setid(i);
list.add(i);
p.bflag = true;
int num = (int) (math.random() * 100) % 2;
if (num == 1) {
p.position = "后门";
} else {
p.position = "qian门";
}
p.notifyall();
while (p.bflag) {
try {
p.wait();
} catch (interruptedexception e) {
e.printstacktrace();
}
}
}
}
}
}
};
thread th3 = new thread(run1);
th1.start();
th2.start();
th3.start();
}
}