Java生産者と消費者の例_動力ノードJava学院の整理


生産者-消費者(producer-consumer)の問題は、境界バッファとも呼ばれる問題で、2つのプロセスは共通の固定サイズのバッファを共有します。その中の一つは生産者で、メッセージをバッファに入れるためです。もう一つは消費者で、バッファからメッセージを取り出すためです。問題が発生したのはバッファが満杯になりましたが、生産者が新たなデータを中に入れたい場合、その解決方法は生産者にこの時休眠させ、消費者がバッファから1つ以上のデータを取ってから呼び覚まします。同様に、バッファが空きました。消費者はまたメッセージを取りに行きたいです。この時も消費者を休眠させて、生産者が1つ以上のデータを入れるのを待ってから呼び覚ましてもいいです。
一、まず公共資源類を定義し、その中の変数numberは保存された公共データである。
また、2つの方法を定義し、numberの値を増加させ、numberの値を減少させる。マルチスレッドのためには、synchronizedキーを付けなければなりませんので、while判定の条件に注意してください。
Javaコード  
二、それぞれ生産を定義する。

 /** 
 *       
 */ 
 public class PublicResource { 
   private int number = 0; 
  
   /** 
   *        
   */ 
   public synchronized void increace() { 
     while (number != 0) { 
       try { 
         wait(); 
       } catch (InterruptedException e) { 
         e.printStackTrace(); 
       } 
     } 
     number++; 
     System.out.println(number); 
     notify(); 
   } 
  
   /** 
   *        
   */ 
   public synchronized void decreace() { 
     while (number == 0) { 
       try { 
         wait(); 
       } catch (InterruptedException e) { 
         e.printStackTrace(); 
       } 
     } 
     number--; 
     System.out.println(number); 
     notify(); 
   } 
 } 
スレッドと消費スレッドは、複数の生産と消費をシミュレートし、すなわち、公共資源のnumber値を増加し、減少させる。
Javaコード  

/** 
 *      ,         
 */ 
 public class ProducerThread implements Runnable { 
   private PublicResource resource; 
  
   public ProducerThread(PublicResource resource) { 
     this.resource = resource; 
   } 
  
   @Override 
   public void run() { 
     for (int i = 0; i < 10; i++) { 
       try { 
         Thread.sleep((long) (Math.random() * 1000)); 
       } catch (InterruptedException e) { 
         e.printStackTrace(); 
       } 
       resource.increace(); 
     } 
   } 
 } 
 /** 
 *      ,         
 */ 
 public class ConsumerThread implements Runnable { 
   private PublicResource resource; 
  
   public ConsumerThread(PublicResource resource) { 
     this.resource = resource; 
   } 
  
   @Override 
   public void run() { 
     for (int i = 0; i < 10; i++) { 
       try { 
         Thread.sleep((long) (Math.random() * 1000)); 
       } catch (InterruptedException e) { 
         e.printStackTrace(); 
       } 
       resource.decreace(); 
     } 
   } 
 } 
第三に、複数の生産者と消費者が公共資源を操作する状況を模擬し、結果は許容範囲内であることを保証しなければならない。
Javaコード  

public class ProducerConsumerTest { 
   public static void main(String[] args) { 
     PublicResource resource = new PublicResource(); 
     new Thread(new ProducerThread(resource)).start(); 
     new Thread(new ConsumerThread(resource)).start(); 
     new Thread(new ProducerThread(resource)).start(); 
     new Thread(new ConsumerThread(resource)).start(); 
     new Thread(new ProducerThread(resource)).start(); 
     new Thread(new ConsumerThread(resource)).start(); 
   } 
 } 
以上のように、Java生産者と消費者の例を紹介しました。皆さんに何かご質問があれば、メッセージをください。編集者はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。