一、概述
模拟生产者消费者问题
二、代码
1.Consumer.java
2.Producer.java
3.SyncStack.java
4.Test.java
1.Consumer.java
package ProducerConsumer; public class Consumer implements Runnable { private SyncStack syncStack; public Consumer(SyncStack syncStack) { super(); this.syncStack = syncStack; } public void consume(){ Product p; for(int i = 0 ; i < 10 ; i++){ p = syncStack.pop(); System.out.println("******消费了:"+p); } } @Override public void run() { // try { // Thread.sleep(10); // } catch (InterruptedException e) { // e.printStackTrace(); // } consume(); } }
2.Producer.java
package ProducerConsumer; public class Producer implements Runnable { private SyncStack syncStack; public Producer(SyncStack syncStack) { super(); this.syncStack = syncStack; } public void produce(){ for(int i = 0 ; i < 10 ; i++){ Product p = new Product(i); syncStack.push(p); System.out.println("生产了:"+p); } } @Override public void run() { produce(); } }
3.SyncStack.java
package ProducerConsumer; import java.util.ArrayList; import java.util.List; public class SyncStack { int index = 0; Product [] ps = new Product[6]; //List<Product> ps = new ArrayList<Product>(); public synchronized void push(Product p) { //if(index == ps.length){ //不能用if判断,若用if,则this.wait()出现异常时,代码仍会往下执行 while(index == ps.length){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); ps[index] = p; index = index + 1; //System.out.println(index); } public synchronized Product pop() { while(index == 0){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); index --; return ps[index]; // System.out.println("ps===="+ps); // Product p = ps.get(ps.size()-1); // ps.remove(ps.size()-1); // return p; } }
4.Test.java
package ProducerConsumer; public class Test { public static void main(String[] args) { SyncStack ss = new SyncStack(); Producer p1 = new Producer(ss); Consumer c1 = new Consumer(ss); Thread tp1 = new Thread(p1); Thread tc1 = new Thread(c1); tc1.start(); tp1.start(); new Thread(new Producer(ss)).start(); new Thread(new Consumer(ss)).start(); } }
三、运行结果
四、小结
1.this.wait(),保有先锁定,才能调用wait,wait是使正在访问本对象的线程wait,且wait后此线程的锁会丢失,只有当线程醒来后才会再去找回锁。sleep则锁不会丢失。
2.this.notify()唤醒一个正在wait当前对象上的一个线程
时间: 2024-09-30 19:44:06