教室有2个门口,上课时,同学陆陆续续进入教室
利用多线程,模拟这个过程,把这个过程打印出来,并且统计出每个门口进入的学生人数。
假设班里人共64个人
要求:
可能是编号为1的同学从前门进入
然后是编号为52的同学从后门进入
。。。。
也就是说,同学进入教室的顺序,并不是按照编号的顺序进入的,而是随机进入的。
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
new Thread(mr,"前门").start();
new Thread(mr,"后门").start();
}
}
class MyRunnable implements Runnable{
Hashtable<String, Integer> ht = new Hashtable<>();
int flag = -1;
public void run() {
while(true){
String name = Thread.currentThread().getName();
int index = getUnUsedIndex(); //返回一个还没有进入班级的同学的编号
if (index == -1) { //如果index=-1,表明全班人都进班了
if (flag == 0) {
System.out.println(ht);
break;
}
flag = 0;
break;
}
System.out.println("编号为:" + index + " 的同学从 " + name + " 进入了班级");
//统计每个线程执行的次数
if (!ht.containsKey(name)) {
ht.put(name, 1);
}else {
ht.put(name, ht.get(name)+1);
}
}
}
Random r = new Random();
ArrayList<Integer> al = new ArrayList<>();
//返回一个还没有进入班级的同学的编号
private int getUnUsedIndex() {
int index = r.nextInt(64)+1;
while(al.contains(index) && al.size()<64){
index = r.nextInt(64)+1;
}
if (al.size()==64) {
return -1;
}
al.add(index);
return index;
}
} |
|