2、某公司組織年會,會議入場時有兩個入口,在入場時每位員工都能獲取一張雙色球彩票,假設公司有100個員工,利用多線程模擬年會入場過程,
並分別統計每個入口入場的人數,以及每個員工拿到的彩票的號碼。線程運行后打印格式如下:
編號為: 2 的員工 從后門 入場! 拿到的雙色球彩票號碼是: [17, 24, 29, 30, 31, 32, 07]
編號為: 1 的員工 從后門 入場! 拿到的雙色球彩票號碼是: [06, 11, 14, 22, 29, 32, 15]
//.....
從后門入場的員工總共: 13 位員工
從前門入場的員工總共: 87 位員工
package com.lanqiao.demo9;
/**
* 在測試類中主要是實例化子進程 創建進程
* 啟動進程 不要調用run'方法 start
*
* @author qichunlin
*
*/
public class Test {
public static void main(String[] args) {
// 實例化子進程
myThread mt = new myThread();
// 創建進程
Thread t1 = new Thread(mt, "前門");
Thread t2 = new Thread(mt, "后門");
// 啟動進程
t1.start();
t2.start();
}
}
package com.lanqiao.demo9;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 進場類
* @author qichunlin
*
*/
public class Entering implements Runnable {
// 前門人數
private int frontNum = 0;
// 后門人數
private int backNum = 0;
// 總人數
private int person = 100;
@Override
public void run() {
// 線程體
// 1、統計人數
while (true) {
synchronized (this) {
try {
Thread.sleep(10);
// 獲取線程名稱
String threadName = Thread.currentThread().getName();
// 1-1:總人數<0,退出循環
if (person < 0) {
return;
}
// 1-2:總人數>0,
if (person > 0) {
// 統計前門人數
if ("前門".equals(threadName)) {
System.out.println("編號為: "+(100-person+1)+" 的員工 從前門 入場!拿到的雙色球彩票號碼是: "+this.show());
frontNum++;
}
// 統計后門人數
if ("后門".equals(threadName)) {
System.out.println("編號為: "+(100-person+1)+" 的員工 從后門 入場!拿到的雙色球彩票號碼是: "+this.show());
backNum++;
}
person--;
}
// 1-3:總人數==0,顯示前門人數及后門人數
if (person == 0) {
System.out.println("前門人數:"+frontNum);
System.out.println("后門人數:"+backNum);
person--;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 2、顯示雙色球結果
public List<Integer> show() {
//7 創建集合
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i <7; i++) {
Random r = new Random();
int num = r.nextInt(33)+1;
list.add(num);
}
return list;
}
}
