黑马程序员技术交流社区
标题:
jdk1.5同步锁模拟经典同步问题之生产者消费者
[打印本页]
作者:
苟苟
时间:
2015-5-4 16:54
标题:
jdk1.5同步锁模拟经典同步问题之生产者消费者
jdk1.5同步锁模拟经典同步问题之生产者消费者. 代码如下
import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 使用JDK1.5线程同步锁新特性实现生产者和消费者的例子
*
*/
class Main {
public static void main(String[] args) {
Buffer buffer = new Buffer();
Producer producer = new Producer(buffer);
Consumer consumer = new Consumer(buffer);
producer.start();
consumer.start();
}
}
// 商品缓冲区
class Buffer {
private Lock lock;
private Condition full;
private Condition empty;
//商品缓冲区最大容量4
private static int MAX_CAPACITY = 4;
private ArrayList<Commodity> buffer = new ArrayList<Commodity>(MAX_CAPACITY);
Buffer() {
lock = new ReentrantLock();
full = lock.newCondition();
empty = lock.newCondition();
}
public void add(String local, float weight) {
lock.lock();
try {
if (buffer.size() >= MAX_CAPACITY) {
System.out.println("buffer满了, 阻塞生产线程");
full.await();
}
Commodity commodity = new Commodity(local, weight);
buffer.add(commodity);
System.out.println("生产: " + commodity.toString() + " " + "还剩下商品 " + buffer.size());
empty.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void remove() {
lock.lock();
try {
if (buffer.size() <= 0) {
System.out.println("buffer空了, 阻塞消费者线程 " + buffer.size());
empty.await();
}
Commodity commodity = buffer.remove(buffer.size() - 1);
System.out.println("消费: " + commodity.toString() + " " + "还剩下商品 " + buffer.size());
full.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
/**
*
* 生产的商品实体
*/
class Commodity {
private String local;
private float weight;
public Commodity(String local, float weight) {
this.local = local;
this.weight = weight;
}
@Override
public String toString() {
return "Commodity [local=" + local + ", weight=" + weight + "]";
}
}
// 生产者线程
class Producer extends Thread {
private Buffer buffer;
Producer(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0;; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
buffer.add("BJ", i);
}
}
}
// 消费者线程
class Consumer extends Thread {
private Buffer buffer;
Consumer(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
buffer.remove();
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2