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