java多线程-生产者消费者

1.生产者

作用是生产产品

生产逻辑:通过一个生产标记,判断是否需要生产产品

如果需要生产:生产产品,并且通知消费者消费

如果不需要生产:等待

2.消费者

作用是消费产品

消费逻辑:判断是否有足够的产品可以消费

如果可以消费:获取产品,进行消费

如果不可以消费:等待

3.代码实现

1.Program.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package ProducerAndCustomer;

import java.util.LinkedList;
import java.util.List;

class Product {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Product(String name) {
this.name = name;
}

}

class ProductPool {
// 存储所有的产品集合,生产者生产产品,往这个集合添加元素,消费者消费产品,从这个集合中取元素
private List<Product> list;
private int maxsize = 0;

public ProductPool(int maxsize) {
// 对产品进行实例化
this.list = new LinkedList<Product>();
// 限定产品的最大数量
this.maxsize = maxsize;
}

// 生产者将生产好的商品放在商品池
public synchronized void Push(Product product) {
// 判断是否还需要生产
if (this.list.size() == maxsize) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 将产品放在集合中
this.list.add(product);
// 通知其他人,有产品可以消费了
this.notifyAll();

}

public synchronized Product pop() {
// 是否可以有商品去消费
if (this.list.size() == 0) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 从商品池中取出一个商品
Product product = this.list.remove(0);
// 通知所有人,我取出了一个商品
this.notifyAll();

return product;
}
}

public class Program {
public static void main(String[] args) {
// 实例化一个产品池
ProductPool pool = new ProductPool(10);
// 实例化一个生产者
new Productor(pool).start();

new Consumer(pool).start();
}

}

2.Consumer.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package ProducerAndCustomer;

public class Consumer extends Thread{
private ProductPool pool;
public Consumer(ProductPool pool){
this.pool=pool;
}
@Override
public void run() {
while(true){
Product product=this.pool.pop();
System.out.println("消费者消费了一件产品"+product.getName());


}
}
}

3.Productor.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package ProducerAndCustomer;

public class Productor extends Thread {
private ProductPool pool;
public Productor(ProductPool pool){
this.pool=pool;
}

@Override
public void run() {
while(true){
String name=(int) (Math.random()*100)+"号";
Product product=new Product(name);

this.pool.Push(product);
System.out.println("生产者添加了一个产品"+name);


}
}
}

运行截图:

image-20191218212923001

-------------本文结束感谢您的阅读-------------
0%