zoukankan      html  css  js  c++  java
  • 用 wait-notify 解决生产者-消费者问题


    //生产者
    1 package com.mzj.test; 2 import java.util.Vector; 3 import java.util.logging.Level; 4 import java.util.logging.Logger; 5 6 public class Producer implements Runnable { 7 8 private final Vector sharedQueue; 9 private final int SIZE; 10 11 public Producer(Vector sharedQueue, int size) { 12 this.sharedQueue = sharedQueue; 13 this.SIZE = size; 14 } 15 16 @Override 17 public void run() { 18 // TODO Auto-generated method stub 19 for (int i = 0; i < 7; i++) { 20 System.out.println("Produced:" + i); 21 try { 22 produce(i); 23 } catch (InterruptedException ex) { 24 Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex); 25 } 26 } 27 } 28 29 private void produce(int i) throws InterruptedException { 30 31 //wait if queue is full 32 while (sharedQueue.size() == SIZE) { 33 synchronized (sharedQueue) { 34 System.out.println("Queue is full " + Thread.currentThread().getName() 35 + " is waiting , size: " + sharedQueue.size()); 36 sharedQueue.wait(); 37 } 38 } 39 40 //producing element and notify consumers 41 synchronized (sharedQueue) { 42 sharedQueue.add(i); 43 sharedQueue.notifyAll(); 44 } 45 } 46 }

    消费者

     1 package com.mzj.test;  
     2 import java.util.Vector;  
     3 import java.util.logging.Level;  
     4 import java.util.logging.Logger;  
     5   
     6 public class Consumer implements Runnable {  
     7   
     8     private final Vector sharedQueue;  
     9     private final int SIZE;  
    10       
    11     public Consumer(Vector sharedQueue, int size) {  
    12         this.sharedQueue = sharedQueue;  
    13         this.SIZE = size;  
    14     }  
    15   
    16     @Override  
    17     public void run() {  
    18         // TODO Auto-generated method stub  
    19         while (true) {  
    20             try {  
    21                 System.out.println("Consumer: " + consume());  
    22                 Thread.sleep(50);  
    23             } catch (InterruptedException ex) {  
    24                 Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);  
    25             }  
    26         }  
    27     }  
    28       
    29     private int consume() throws InterruptedException {  
    30           
    31         //wait if queue is empty  
    32         while (sharedQueue.isEmpty()) {  
    33             synchronized (sharedQueue) {  
    34                 System.out.println("Queue is empty " + Thread.currentThread().getName()  
    35                         + " is waiting , size: " + sharedQueue.size());  
    36                 sharedQueue.wait();  
    37             }  
    38         }  
    39           
    40         //otherwise consume element and notify waiting producer  
    41         synchronized (sharedQueue) {  
    42             sharedQueue.notifyAll();  
    43             return (Integer) sharedQueue.remove(0);  
    44         }  
    45     }  
    46 } 

    测试

     1 package com.mzj.test;  
     2 import java.util.Vector;  
     3   
     4 public class ProducerConsumerSolution {  
     5   
     6     public static void main(String[] args) {  
     7         Vector sharedQueue = new Vector();  
     8         int size = 4;  
     9         Thread prodThread = new Thread(new Producer(sharedQueue, size), "Producer");  
    10         Thread consThread = new Thread(new Consumer(sharedQueue, size), "Consumer");  
    11         prodThread.start();  
    12         consThread.start();  
    13     }  
    14 }
  • 相关阅读:
    C#操作OFFICE一(EXCEL)
    json的使用二(转)
    xpath简介(转载)
    使用LogParser分析IIS网站日志
    WCF Data Contract KnownTypeAttribute转载
    ExtJs中同一个URL构造多个Ext.data.JsonStore 转载
    转载Ext.form.formPanel 与服务器交互 初始化表单
    oracle表数据误删恢复
    JavaScript基础之Array函数
    Json格式类的转换相关代码转载
  • 原文地址:https://www.cnblogs.com/mengzj233/p/9848085.html
Copyright © 2011-2022 走看看