多线程——生产者消费者问题
2021-01-30 20:16
标签:lin str first remove over while mes time private 多线程——生产者消费者问题 标签:lin str first remove over while mes time private 原文地址:https://www.cnblogs.com/dch-21/p/12819296.htmlimport java.util.LinkedList;
/**
* @Author 昊
* @Create 2020/5/2 9:34
* @Description 临界资源,存放汉堡
*/
public class Box {
//要进行频繁的删除操作所以使用LinkedList
private LinkedList
/**
* @Author 昊
* @Create 2020/5/2 9:34
* @Description
*/
public class Hamburger {
//汉堡编号
private int id;
//汉堡名称
private String name;
public Hamburger(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Hamburger{" +
"id=" + id +
", name=‘" + name + ‘\‘‘ +
‘}‘;
}
}
/**
* @Author 昊
* @Create 2020/5/2 9:35
* @Description 消费者
*/
public class Customer extends Thread{
//消费者需要知道从哪个橱柜中获取汉堡
private Box box;
//模拟消费的时间
private long timeMillions;
public Customer(Box box,String name,long timeMillions) {
super(name);
this.timeMillions = timeMillions;
this.box=box;
}
@Override
public void run() {
while(true){
if(this.box.getList().size()==0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Hamburger hamburger=this.box.pop();
System.out.println(getName()+"取出了编号是"+hamburger.getId()+"的"+hamburger.getName());
//取出汉堡
try {
//模拟消费时间
Thread.sleep(timeMillions);
} catch (InterruptedException e) {
e.printStackTrace();
}
hamburger=null;
}
}
}
import java.util.Random;
/**
* @Author 昊
* @Create 2020/5/2 9:35
* @Description 生产者
*/
public class Producer extends Thread{
//生产者需要知道从哪个橱柜中获取汉堡
private Box box;
//模拟生产者的生产时间
private long timeMillions;
public Producer(Box box,String name,long timeMillions) {
super(name);
this.timeMillions = timeMillions;
this.box=box;
}
@Override
public void run() {
String[] names = {"香辣鸡腿堡", "菠萝鸡腿堡", "劲脆鸡腿堡", "双层牛肉汉堡", "鳕鱼堡"};
Random random = new Random();
while(true){
Hamburger hamburger = new Hamburger(random.nextInt(1000), names[random.nextInt(names.length)]);
try {
//模拟生产时间
Thread.sleep(timeMillions);
} catch (InterruptedException e) {
e.printStackTrace();
}
//存入汉堡
this.box.push(hamburger);
System.out.println(getName()+"制作了编号是"+hamburger.getId()+"的"+hamburger.getName());
}
}
}
/**
* @Author 昊
* @Create 2020/5/2 9:36
* @Description
*/
public class Program {
public static void main(String[] args) {
Box box=new Box();
Producer p1=new Producer(box,"黄小厨",100);
Producer p2=new Producer(box,"白小厨",120);
Producer p3=new Producer(box,"蓝小厨",80);
Customer c1=new Customer(box,"李雷",1000);
Customer c2=new Customer(box,"韩梅梅",1200);
Customer c3=new Customer(box,"Judy",1500);
Customer c4=new Customer(box,"Lucy",1000);
Customer c5=new Customer(box,"Poly",1000);
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
c3.start();
c4.start();
c5.start();
}
}
上一篇:Leetcode练习(Python):链表类:第86题:分隔链表:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点