需求:
1.有一个仓库,容量为7,可以存放 A-G字符。
2.默认仓库里没有字符,消费者想从仓库中一个一个的获取字符,所以要通知生产者生产字符,生产者则开始生产A,B,C...G字符放入仓库中。
3.当仓库已满,则生产者通知消费者开始消费字符,则消费者按照A-G字符顺序一个个取字符,当仓库被取空后,则消费者通知生产者开始生产。
4.生产者和消费者按照每秒一个字符的速度生产和消费字符。
生产者线程:
package producerandconsumer;
import java.util.Random;
public class Produder extends Thread{
Warehouse warehouse;
public Produder(Warehouse warehouse) {
this.warehouse = warehouse;
}
@Override
public void run() {
Random random = new Random();
while (true){
synchronized (warehouse){
if (warehouse.characters.size()>=Warehouse.MAX){
try {
warehouse.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 65; i <65+7 ; i++) {
System.out.println("开始生产字母"+(char)i);
warehouse.characters.add((char) i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("仓库此时有"+warehouse.characters.size()+"个字母");
warehouse.notify(); //唤醒消费者线程
}
}
}
}
消费者线程:
package producerandconsumer;
import java.util.Iterator;
import java.util.Random;
public class Consumer extends Thread{
Warehouse warehouse;
public Consumer(Warehouse warehouse) {
this.warehouse = warehouse;
}
@Override
public void run() {
Random random = new Random();
while (true){
synchronized (warehouse){
if (warehouse.characters.size()<=0){
try {
warehouse.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//------------------------------------随机消费代码如下:------------------------------------------
// int count = random.nextInt(warehouse.characters.size())+1; //随机消费字母
//
//
// warehouse.characters.removeAll(warehouse.characters.subList(0,count));
//随机删除集合里的字母
//
//
// System.out.println("随机消费字母"+count+"个,仓库此时有"+warehouse.characters.size()+"个字母");
Iterator<Character> iterator = warehouse.characters.iterator();
if (iterator.hasNext()){
System.out.println("删除了"+iterator.next());
iterator.remove();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
warehouse.notify(); //唤醒消费者线程
}
}
}
}
仓库:
package producerandconsumer;
import java.util.ArrayList;
import java.util.List;
public class Warehouse {
public static int MAX =7;
public List<Character> characters = new ArrayList<>();
}
测试类:
package producerandconsumer;
public class Test {
public static void main(String[] args) {
Warehouse warehouse = new Warehouse();
Consumer consumer = new Consumer(warehouse);
Produder produder = new Produder(warehouse);
produder.start();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
consumer.start();
}
}