JAvaは簡単な生産者-消費者のdemoを実現する


この間、生成者と消費者がjavaでどうやって実現するのかと聞かれ、全く思い出せませんでしたが、帰ってきて本を読んだとき、ちょうどこの一節を見て、demoを書いて、印象を深め、記録しました.
     ここでは主にLinkBlockingQueueを使用してキューを作り、demo全体の2つのスレッドの直接的なデータ伝達をサポートしています.LinkBlockingQueueの最大の特徴は設定可能な長さです.putメソッドでアクセスする場合、キューがいっぱいになるとブロックされます.同様にtakeを使用して削除項目を読み込む場合、キューが空になるとブロックされます.putメソッドとtakeメソッドは並列で,互いに干渉せず,メッセージングに非常に適している.
     LinkBlockingQueueの原理については、次のリンクを見ることをお勧めします.ここではdemoを記録するだけで、接触するだけで、原理についてはあまり深く検討しません.リンクは次のとおりです.java同時ブロックキューLinkedBlockingQueueとArrayBlockingQueueを深く分析します.
1、まず生産者ProductThreadを実現し、2秒ごとにデータを生産する
 import java.util.concurrent.BlockingQueue;

 /**
  *      
  */
 public class ProductThread extends  Thread {
    private BlockingQueue queue;
    public ProductThread(BlockingQueue queue){
            this.queue = queue;
    }


    @Override
    public void run() {
        int i=1;
        while (true){

            try {
                queue.put(" : "+i+"  ");            //       ,        ,         
                System.out.println("   "+i+"  --");
                Thread.sleep(2000);
                i++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }
}

2、Consumer Thread、消費者スレッド、3秒ごとにキューを読み込む
import javax.sound.midi.Soundbank;
import java.util.concurrent.BlockingQueue;

/**
 *      
 */
public class ConsumerThread extends Thread {
    private  BlockingQueue queue;
    public ConsumerThread(BlockingQueue queue){
        this.queue = queue;
    }

    @Override
    public void run() {
         while (true){ 
             try {
                 System.out.println("  :"+queue.take());   //queue   ,take     
                 Thread.sleep(3000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }


         }
    }
}

 
3、テストクラスProducterAndConsumer、それぞれ2つのスレッドを起動する
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class ProducterAndConsumer {


    public static void main(String[] args) {
        BlockingQueue queue = new LinkedBlockingQueue<>(100);  //     100
        new ProductThread(queue).start();
        new ConsumerThread(queue).start();
    }
}