JAVA 多线程练习题:手机工厂

这是一个关于使用JAVA实现手机工厂多线程模拟的练习题。题目要求根据订单分配临时工生产不同型号的手机,并在生产完成后打印每批的生产冠军。思路包括创建PhoneTask类,继承Runnable,设置生产效率随机的工人并使用同步锁控制并发。在主函数中,创建订单,生成随机数量的工人线程,并等待所有线程执行完成,最后输出生产冠军。
摘要由CSDN通过智能技术生成

 

目录

一.题目:

二.思路:

PhoneTask

主函数:

三.参考代码


一.题目:

有一个制造手机工厂,根据订单来安排人员生产。
现在有以下的订单:
[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开始.....

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值