您的位置:首页 > 编程语言 > Java开发

Java实现生产者消费者

2014-03-17 22:33 218 查看
方法1:最简单--利用LinkedBlockingQueue

队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构。
1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点。 ——put()方法
2.从队列头部取一个对象,如果没有对象,就等待直到有对象可取。 ——take()方法
3.在存取队列的过程中,锁定队列对象,不允许其它线程访问队列。——使得它是线程安全的

下面的代码适用于多个生产者、多个消费者。

import java.util.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ProducerConsumer {
private static final LinkedList<Integer> buffer = new LinkedList<Integer>();
private static final int BUFFERSIZE = 10;
private static Lock lock = new ReentrantLock();//可重用的互斥锁
private static Condition NotFull = lock.newCondition();
private static Condition NotEmpty = lock.newCondition();

static class Producer extends Thread {
public void run() {
while (true) {
// lock
lock.lock();
if (buffer.size() == BUFFERSIZE) {
System.out.println("BUffer is fulls");
try {
NotFull.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
buffer.addLast(1);
NotEmpty.signal();
}
lock.unlock();
// unlock
}
}
}

static class Consumer extends Thread {
public void run() {
while (true) {
// lock
lock.lock();
if (buffer.size() == 0) {
System.out.println("BUffer is empty");
try {
NotEmpty.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
buffer.removeFirst();
NotFull.signal();
}
// unlock
lock.unlock();
}
}
}

public static void main(String[] args){
new Consumer().start();
new Producer().start();
}
}


ProducerConsumer .java

关于Java线程的lock、condition、synchronized的小小总结:

1.synchronized简单易用,但是功能受局限,无法满足复杂的同步机制,比如“读者写者问题”:多个读者线程是不互斥的。

2.lock以更优雅的方式来解决线程同步,比如读写锁ReadWriteLock。

3.Condition解决线程间通信,为不同的线程建立不同的条件。

推荐博文:Java线程-锁机制

Condition可以替代传统的线程间通信,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll()。

——为什么方法名不直接叫wait()/notify()/nofityAll()?因为Object的这几个方法是final的,不可重写!

Condition实现了BlockingQueue的功能。

看看BlockingQueue的继承和实现。



一般的锁Lock的实现:注意ReadLock、WriteLock是内部的静态类,只有ReentrantReadWriteLock类可以调用。



读写的锁ReadWriteLock



思考:OS的信号量是什么,线程通信的方式有哪些?共享变量和消息传递。

信号量与互斥锁有什么联系?

参考资料


By BYRHuangQiang 2014-03-18 09:05:30
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: