//生产者生产商品,消费者取走商品,
//当商品个数为2时,停止生产,消费者可以消费;
//当商品个数为0时,停止取走, 生产者开始生产
//抽象出三个类,生产者,消费者,商品,商品有商品数量属性,和生产、消费方法
class Procedure implements Runnable{
private Shangpin shangpin;
public Procedure(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
System.out.println("Procedure");
shangpin.procedure();
}
}
class Consume implements Runnable{
private Shangpin shangpin;
public Consume(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
System.out.println("Consume");
shangpin.consume();
}
}
class Shangpin{
private int num;
private boolean flag = true;
public synchronized void consume(){
}
public synchronized void procedure(){
}
}
public class TestPro_Con {
public static void main(String[] args) {
Shangpin shangpin = new Shangpin();
new Thread(new Procedure(shangpin)).start();
new Thread(new Consume(shangpin)).start();
}
}
//22.用JAVA中的多线程示例生产者和消费者问题
//生产者生产商品,消费者取走商品,
//当商品个数为2时,停止生产,消费者可以消费;
//当商品个数为0时,停止取走, 生产者开始生产
//抽象出三个类,生产者,消费者,商品,商品有商品数量属性,和生产、消费方法
//如何实现一边生产一边消费
class Procedure implements Runnable{
private Shangpin shangpin;
public Procedure(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
while(true){
System.out.println("Procedure");
shangpin.procedure();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
class Consume implements Runnable{
private Shangpin shangpin;
public Consume(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
while(true){
System.out.println("Consume");
shangpin.consume();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
class Shangpin{
private int num;
private boolean flag = true;
public synchronized void consume(){
while(!flag){
System.out.println("消费了一个商品");
System.out.println("现在一共有: "+(--num)+" 个商品");
if(this.num <= 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
}
}
notify();
}
public synchronized void procedure(){
while(flag){
System.out.println("生产了一个商品");
System.out.println("现在一共有: "+(++num)+" 个商品");
if(this.num >= 2){
try {
// Thread.currentThread().wait();
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
}
}
// Thread.currentThread().notify();
notify();
}
}
public class TestPro_Con {
public static void main(String[] args) {
Shangpin shangpin = new Shangpin();
new Thread(new Procedure(shangpin)).start();
new Thread(new Consume(shangpin)).start();
}
}
class Producer implements Runnable {
private SyncStack stack;
public Producer(SyncStack stack) {
this.stack = stack;
}
public void run() {
for (int i = 0; i < stack.getProducts().length; i++) {
String product = "产品" + i;
stack.push(product);
System.out.println("生产了: " + product);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private SyncStack stack;
public Consumer(SyncStack stack) {
this.stack = stack;
}
public void run() {
for (int i = 0; i < stack.getProducts().length; i++) {
String product = stack.pop();
System.out.println("消费了: " + product);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class SyncStack {
private String[] products = new String[2];
private int index;
public synchronized void push(String product) {
if (index == product.length()) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
products[index] = product;
index++;
}
public synchronized String pop() {
if (index == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
index--;
String product = products[index];
return product;
}
public String[] getProducts() {
return products;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
SyncStack stack = new SyncStack();
Producer p = new Producer(stack);
Consumer c = new Consumer(stack);
new Thread(p).start();
new Thread(c).start();
}
}