Java多线程之生产者(Producer)和消费者(Consumer)模式:
示例1:
public class Resource {
private int i = 0;
private int limit;
public Resource(int limit) {
this.limit = limit;
}
public synchronized void increase() {
while(i == limit) {
try {
wait();
} catch (InterruptedException e) {
}
}
i++;
System.out.println(Thread.currentThread().getName() + ": " + i);
notifyAll();
}
public synchronized void decrease() {
while(i == 0) {
try {
wait();
} catch (InterruptedException e) {
}
}
i--;
System.out.println(Thread.currentThread().getName() + ": " + i);
notifyAll();
}
}
public class ProducerConsumer {
private Resource resource;
private int count;
public ProducerConsumer(Resource resource, int count) {
this.resource = resource;
this.count = count;
}
class Producer implements Runnable {
@Override
public void run() {
for(int i = 0; i < count; i++) {
resource.increase();
}
}
}
class Consumer implements Runnable {
@Override
public void run() {
for(int i = 0; i < count; i++) {
resource.decrease();
}
}
}
public Producer getProducer() {
return new Producer();
}
public Consumer getConsumer() {
return new Consumer();
}
public static void main(String[] args) {
Resource rs = new Resource(20);
ProducerConsumer pc = new ProducerConsumer(rs, 100);
new Thread(pc.getProducer()).start();
new Thread(pc.getConsumer()).start();
}
}
示例2: 使用BlockingQueue
public class ProductQueue {
private BlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
class ProducerTask implements Runnable {
@Override
public void run() {
try {
queue.put(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class ConsumerTask implements Runnable {
@Override
public void run() {
try {
System.out.println(queue.take());
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public ProducerTask getProducerTask() {
return new ProducerTask();
}
public ConsumerTask getConsumerTask() {
return new ConsumerTask();
}
public static void main(String[] args) {
ProductQueue queue = new ProductQueue();
for (int i = 0; i < 10; i++) {
new Thread(queue.getProducerTask(), "Producer" + (i + 1)).start();
new Thread(queue.getConsumerTask(), "Consumer" + (i + 1)).start();
}
}
}