回顾生产者/消费者问题下产生的java多线程(二)(二)

2014-11-24 02:22:25 · 作者: · 浏览: 5
MAX = 10;
private final Lock lock = new ReentrantLock();
private final Condition full = lock.newCondition();
private final Condition empty = lock.newCondition();

public Sycn2(){
}

public void start(){
new Producer().start();
new Consumer().start();
}

public static void main(String[] args) throws Exception{
Sycn2 s2 = new Sycn2();
s2.start();
}

class Producer extends Thread{
public void run(){
while(true){
lock.lock();
try{
while(myList.size() == MAX){
System.out.println("warning: it's full!");
full.await();
}
Object o = new Object();
if(myList.add(o)){
System.out.println("Producer: " + o);
empty.signal();
}
}catch(InterruptedException ie){
System.out.println("producer is interrupted!");
}finally{
lock.unlock();
}
}
}
}

class Consumer extends Thread{
public void run(){
while(true){
lock.lock();
try{
while(myList.size() == 0){
System.out.println("warning: it's empty!");
empty.await();
}
Object o = myList.removeLast();
System.out.println("Consumer: " + o);
full.signal();
}catch(InterruptedException ie){
System.out.println("consumer is interrupted!");
}finally{
lock.unlock();
}
}
}
}

}

3. 阻塞队列方法BlockingQueue
BlockingQueue也是JDK5.0的一部分,它是一个已经在内部实现了同步的队列,实现方式采用的是我们的第2种await()/signal()方法。它可以在生成对象时指定容量大小。
它用于阻塞操作的是put()和take()方法。
put()方法类似于我们上面的生产者线程,容量最大时,自动阻塞。
take()方法类似于我们上面的消费者线程,容量为0时,自动阻塞。
import java.util.concurrent.*;

public class Sycn3{
private LinkedBlockingQueue queue = new LinkedBlockingQueue(10);
private int MAX = 10;

public Sycn3(){
}

public void start(){
new Producer().start();
new Consumer().start();
}