本帖最后由 水月灬清影 于 2016-8-29 15:35 编辑
也是论坛里见的题目,不论是不是考试题,我是做了,题目如下:
某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程,
并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下:
编号为: 2 的员工从后门入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
编号为: 1 的员工从后门入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
//.....
从后门入场的员工总共: 13 位员工
从前门入场的员工总共: 87 位员工
代码如下:
[Java] 纯文本查看 复制代码 import java.util.ArrayList;
import java.util.Random;
public class LuckyBalls {
public static void main(String[] args) {
MyThread my=new MyThread();
Thread t1=new Thread(my,"前门");
Thread t2=new Thread(my,"后门");
t1.start();
t2.start();
}
}
public class MyThread implements Runnable{
private int person=100;
private Object obj=new Object();
private int front=0;
private int back=0;
public void run() {
while(true){
synchronized(obj){
//由于多次用到线程名称,特设置一个变量表示
String name=Thread.currentThread().getName();
if(person>0){
//Set集合更为简单,本例只是为了练习用contains()判断List集合是否含重复元素
ArrayList<String> list=new ArrayList<String>();
//注意用list.size()作为循环结束条件
for(int x=0;list.size()<7;x++){
Random r=new Random();
int num=r.nextInt(99)+1;
//转成字符串,对10以下数补零!
String s="";
if(num<10){
s="0"+String.valueOf(num);
}else{
s=String.valueOf(num);
}
//contains()方法是去重的关键
if(!list.contains(s)){
list.add(s);
}
}
//计数
if(name.equals("前门")){
front++;
}else{
back++;
}
//直接输出list集合即可满足所要求的格式,不必转成数组
System.out.println("编号为:"+(person--)+"的员工从"+name+"入场! 拿到的双色球彩票号码是:"+list);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
//输出前后门总数 并 跳出循环以结束线程运行
if(name.equals("前门")){
System.out.println(name+"共计"+front+"人");break;
}else{
System.out.println(name+"共计"+back+"人");break;
}
}
}
}
}
}
|