目录
一.题目:
有一个制造手机工厂,根据订单来安排人员生产。
现在有以下的订单:
[1] 1000台, Sumsung 手机。
[2] 500台,iPhone手机。
[3] 880台,小米手机。
[4] 1800台,Nodia手机。
[5] 1400台,黑莓手机。
工厂请的都是临时工,每生产完一批订单,
又重新请一批人,随机生成人数(5-15人左右)。
每个人的生产效率也是不一样的。
打印每批工人的生产冠军(产量第-一)。
二.思路:
PhoneTask
1.使用多线程,继承Runnable
2.成员变量:生产手机的总数、每个员工生产了多少(用数组存储)、taskName代表生产的手机型号
3.构造器
4.printNo1() 打印第一名的方法
5.delay(int ms)延时的方法
6.run方法:每个工人的线程名是自己命名的,假设命名为:worker1,worker2....
用replace()方法获得索引号:1,2,3....
把索引号转为int类型
这样就可以通过produces【索引号】来知道是第几个工人了
用随机数来随机决定延时多久,也就是某个工人做多久
7.同步锁(定义一个taskName代表生产的手机型号):剩余量-1,某个工人生产数+1
主函数:
1.定义一个订单类,构造方法中获得taskName,count
2.创建订单对象,调用main函数中的prodece(order1)方法
3.prodece(Order order)
(1)使用随机数生成工人数 5-8
(2)生成任务
(3)生成线程:使用数组和循环
(4)创建及开启线程:循环 start()
(5)等待所有人线程执行完成:循环 join()
(6)打印第一名
三.参考代码
package com.gongsi.cn.test7;
//手机工厂
public class PhoneTask implements Runnable{
//成员变量
private int count;//当前任务的任务量(手机总数)
private int[] produces ;//每个工人的生产数
private String taskName;
//构造器
public PhoneTask(String taskName,int count,int workerCnt) {
this.taskName=taskName;
this.count=count;
//下标从1开始算
this.produces=new int[workerCnt+1];
}
@Override
public void run() {
//每个工人的线程名是这样命名的(创建线程的时候自己命名的):worker1,worker2......
String name=Thread.currentThread().getName();
//获取索引号 1,2,3....
String n=name.replace("worker", "");
//转为int类型
int no=Integer.valueOf(n);
while (count>0) {
//生成速度 10-20ms
int speed = (int) ((Math.random()*11)+10);
delay(speed);
synchronized (taskName) {
count--;//剩余量-1
produces[no]++;//某个工人生产数+1
}
}
}
//打印第一名:不含并列第一名
public void printNo1() {
int max=0;
int maxId=0;
for (int i = 0; i < produces.length; i++) {
System.out.println(i+"生产数:"+produces[i]);
if (max<produces[i]) {
maxId=i;
max=produces[i];
}
}
System.out.println("产量冠军是工人"+maxId+",产量:"+max);
}
//延时
public void delay(int ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.gongsi.cn.test7;
public class TestMain {
public static void main(String[] args) throws Exception {
Order order1=new Order("红米K30,105");
prodece(order1);
}
static void prodece(Order order) throws Exception {
//生成工人数 5-8
int workCnt=(int) ((Math.random()*4)+5);
//生成任务
PhoneTask task=new PhoneTask(order.taskName, order.count, workCnt);
//生成线程 有多少个工人就有多少个线程
Thread[] ths=new Thread[workCnt+1];
for (int i = 0; i <=workCnt; i++) {
ths[i]=new Thread(task,"worker"+i);
}
//创建及开启线程
for (int i = 0; i < workCnt; i++) {
ths[i].start();
}
//等待所有人线程执行完成
for (int i = 0; i < workCnt; i++) {
ths[i].join();//等待
}
//打印第一名
task.printNo1();
}
}
//订单类
class Order{
public String taskName;
public int count;
public Order(String c) {
String[] date=c.split(",");
taskName=date[0];
count=Integer.valueOf(date[1]);
}
}
不知道为什么它还是从0开始.....