多线程(生产者-消费者)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程(生产者-消费者)相关的知识,希望对你有一定的参考价值。
案例介绍生产者:Producer,消费者Consumer,消费品,Cake,消费品存放队列CakeQueue
代码说明
生产者Producer
public class Producer extends Thread {
private final CakeQueue cakeQueue;
private static int cakeNo = 0;
public Producer(String name, CakeQueue cakeQueue){
super(name);
this.cakeQueue = cakeQueue;
}
public void run(){
try {
while (true) {
Thread.sleep(1000);
Cake cake = new Cake(createCakeNo());
this.cakeQueue.put(cake);
}
} catch (InterruptedException e) {
}
}
private static synchronized int createCakeNo() {
return cakeNo++;
}
}
消费者Consumer
public class Consumer extends Thread{
private final CakeQueue cakeQueue;
public Consumer(String name, CakeQueue cakeQueue) {
super(name);
this.cakeQueue = cakeQueue;
}
public void run(){
try {
while (true) {
Cake cake = cakeQueue.take();
Thread.sleep(1000);
}
} catch (InterruptedException e) {
}
}
}
蛋糕Cake
/**
* 蛋糕
*/
public class Cake {
private final int no;
public Cake(int no) {
this.no = no;
}
public int getNo() {
return this.no;
}
public String toString(){
return "[ Cake No." + no + "]";
}
}
队列CakeQueue
/**
* 存放蛋糕的队列
*/
public class CakeQueue {
private final Cake[] cakeList;
private int head;
private int tail;
private int counter;
public CakeQueue(int num) {
this.cakeList = new Cake[num];
this.head = 0;
this.tail = 0;
this.counter = 0;
}
//同步放入一个蛋糕
public synchronized void put(Cake cake) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + "put:No" + cake.getNo());
while(counter >= cakeList.length){
wait();
}
cakeList[tail] = cake;
tail = (tail + 1) % cakeList.length;
counter++;
notifyAll();
}
//同步获取一个蛋糕
public synchronized Cake take() throws InterruptedException {
while(counter <= 0){
wait();
}
Cake cake = cakeList[head];
head = (head + 1) % cakeList.length;
counter--;
notifyAll();
System.out.println("------" + Thread.currentThread().getName() + "take:No" + cake.getNo());
return cake;
}
}
启动文件
public class Main {
public static void main(String[] args) {
CakeQueue cakeQueue = new CakeQueue(3);
new Producer("Producer-1:", cakeQueue).start();
new Producer("Producer-2:", cakeQueue).start();
new Producer("Producer-3:", cakeQueue).start();
new Consumer("Consumer-1:", cakeQueue).start();
new Consumer("Consumer-2:", cakeQueue).start();
new Consumer("Consumer-3:", cakeQueue).start();
}
}
运行结果
以上是关于多线程(生产者-消费者)的主要内容,如果未能解决你的问题,请参考以下文章