Modelo de productor para pruebas:
package domain;
import java.util.Queue;
/**
* 生产者模型
*
* @author WanAkiko
*
*/
public class Productor implements Runnable {
private Queue<String> queue; // 生产队列
private Integer maxTask; // 最大产量
int i = 1; // 生产计数
public Productor(Queue<String> queue, Integer maxTask) {
super();
this.queue = queue;
this.maxTask = maxTask;
}
@Override
public void run() {
while (true) {
synchronized (queue) {
while (queue.size() >= maxTask) {
try {
queue.wait(); // 线程进入阻塞状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000); // 模拟生产用时
} catch (InterruptedException e) {
e.printStackTrace();
}
String msg = "产品序列-" + (i++);
queue.add(msg);
System.out.println("生产者线程:" + msg);
queue.notify(); // 唤醒阻塞线程
}
}
}
}
Modelo de consumidor para pruebas:
package domain;
import java.util.Queue;
/**
* 消费者模型
*
* @author WanAkiko
*
*/
public class Customer implements Runnable {
private Queue<String> queue; // 生产队列
@SuppressWarnings("unused")
private Integer maxTask; // 最大产量
public Customer(Queue<String> queue, Integer maxTask) {
super();
this.queue = queue;
this.maxTask = maxTask;
}
@Override
public void run() {
while (true) {
synchronized (queue) {
while (queue.size() == 0) {
try {
queue.wait(); // 线程进入阻塞状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000); // 模拟消费用时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者线程:" + queue.remove());
queue.notify(); // 唤醒阻塞线程
}
}
}
}
Prueba de modelo:
package client;
import java.util.LinkedList;
import java.util.Queue;
import domain.Customer;
import domain.Productor;
public class PC01Test {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<String>();
int maxTask = 3;
new Thread(new Productor(queue, maxTask)).start();
new Thread(new Customer(queue, maxTask)).start();
}
}
Ejecutar ejemplo: