Java语言synchronized与lock实现生产者消费者
2017-10-10 11:42
399 查看
synchronized方式
lock方式
package test; import java.util.LinkedList; import java.util.Queue; import java.util.Random; public class ProducerConsumer { public static void main(String args[]) { Queue<Integer> buffer = new LinkedList<>(); int maxSize = 10; ProducerConsumer producerConsumer = new ProducerConsumer(); Thread producer = producerConsumer.new Producer(buffer, maxSize, "PRODUCER"); Thread consumer = producerConsumer.new Consumer(buffer, maxSize, "CONSUMER"); producer.start(); consumer.start(); } class Producer extends Thread{ private Queue<Integer> queue; private int maxSize; public Producer(Queue<Integer> queue,int maxSize,String name) { super(name); this.queue = queue; this.maxSize = maxSize; } @Override public void run() { while(true) { synchronized (queue) { while(queue.size() == maxSize) { System.out.println("Queue is full"); try { queue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Random random = new Random(); int i = random.nextInt(); System.out.println("Producing value : " + i); queue.add(i); queue.notifyAll(); } } } } class Consumer extends Thread{ private Queue<Integer> queue; private int maxSize; public Consumer(Queue<Integer> queue, int maxSize, String name){ super(name); this.queue = queue; this.maxSize = maxSize; } @Override public void run() { while (true) { synchronized (queue) { while (queue.isEmpty()) { System.out.println("Queue is empty"); try { queue.wait(); } catch (Exception ex) { ex.printStackTrace(); } } System.out.println("Consuming value : " + queue.remove()); queue.notifyAll(); } } } } }
lock方式
package test; import java.util.LinkedList; import java.util.Queue; import java.util.Random; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockProducerConsumer { Lock lock = new ReentrantLock(); Condition conditionP = lock.newCondition(); Condition conditionC = lock.newCondition(); public static void main(String args[]) { Queue<Integer> buffer = new LinkedList<>(); int maxSize = 10; LockProducerConsumer producerConsumer = new LockProducerConsumer(); Thread producer = producerConsumer.new Producer(buffer, maxSize, "PRODUCER"); Thread consumer = producerConsumer.new Consumer(buffer, "CONSUMER"); producer.start(); consumer.start(); } class Producer extends Thread{ private Queue<Integer> queue; private int maxSize; public Producer(Queue<Integer> queue,int maxSize,String name) { super(name); this.queue = queue; this.maxSize = maxSize; } @Override public void run() { while(true) { lock.lock(); try { while (true) { while (queue.size() == maxSize) { System.out.println("Queue is full"); try { conditionP.await(); } catch (InterruptedException e) { e.printStackTrace(); } } Random random = new Random(); int i = random.nextInt(); System.out.println("Producing value : " + i); queue.add(i); conditionC.signal(); } }finally { lock.unlock(); } } } } class Consumer extends Thread{ private Queue<Integer> queue; public Consumer(Queue<Integer> queue, String name){ super(name); this.queue = queue; } @Override public void run() { lock.lock(); try { while (true) { while (queue.isEmpty()) { System.out.println("Queue is empty"); try { conditionC.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Consuming value : " + queue.remove()); conditionP.signal(); } }finally { lock.unlock(); } } } }
相关文章推荐
- Java多线程实现生产者消费者程序(Wait,Notify实现和Lock,Condition实现)
- java多线程之多生产者与多消费者案例之Lock和Condition实现方式
- Java实现生产者与消费者(四)(多生产者与多消费者使用lock同步锁)
- Java 多线程 生产者—消费者 通用模式(synchronized已被Lock替代!)
- synchronized和ReentrantLock实现消费者生产者问题
- JAVA synchronized 线程经典 生产者消费者 两个完全不同的实现的方式
- java利用lock和unlock实现消费者与生产者问题(多线程)
- java 分别利用synchronized和jdk1.5新特性实现多消费者-多生产者线程的等待唤醒机制
- JAVA synchronized 线程经典 生产者消费者 两个完全不同的实现的方式
- 生产者-消费者模型的3种Java实现:synchronized,signal/notifyAll及BlockingQueue
- JAVA消费者与生产者模型的几个不同实现
- java实现的生产者和消费者问题-涉及线程同步与通信
- java多线程总结六:经典生产者消费者问题实现
- java多线程实现生产者与消费者问题
- Java 线程同步问题 生产者-消费者 算法实现 -Java学习笔记(29)
- java简单小结(附一个java实现的生产者消费者问题的程序)
- java多线程实现生产者/消费者同步
- 生产者/消费者问题的多种Java实现方式
- 经典线程同步问题(生产者&消费者)--Java实现
- 用java实现生产者和消费者问题