使用java Condition构建生产者消费者

标签: java 线程
650人阅读 评论(0) 收藏 举报
分类:

1.Condition介绍

在上一篇文章中曾经提到对象的wait和notify方法,condition类其实就是这种方法的一种替代性产物。
Condition对象是同Lock结合使用,由Lock进行创建,并且condition.await的调用者必须获取lock,在await时该线程自动释放锁,当其被其他线程signal之后再重新获取锁,这同上一篇博客中提到的sychronized的用法类似。

2. 基于Condition的生产者消费者程序

(貌似ArrayBlockingQueue)这里使用notFull和notEmpty表示链表中元素有无的一个条件,具体代码如下:

package concurrency;

/**
 * Created by wangxiaoyi on 15/11/18.
 */

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class ProducerAndConsumer2 {

    private List<Integer> data = new LinkedList<>();
    private static final int MAX_DATA_LEN = 10;
    private Lock lock = new ReentrantLock();
    private Condition notEmpty = lock.newCondition();// 非空条件
    private Condition notFull = lock.newCondition();// 非满条件


    class Producer implements Runnable {

        private int pid = 0;

        public Producer(int pid){
            this.pid = pid;
        }

        public void run() {
            try {
                while (!Thread.currentThread().isInterrupted()) {


                    lock.lock();

                    while (data.size() >= MAX_DATA_LEN) {
                        System.out.println("Producer" + pid + " waiting ! size : " + data.size());
                        notFull.await(); // 等待notFull.signal唤醒
                    }

                    try{
                        data.add(pid);
                        notEmpty.signal(); // 唤醒notEmpty.await()线程
                        System.out.println("Producer" + pid + " add " + pid + " size: " + data.size());

                    }finally {
                        lock.unlock();
                    }

                    Thread.sleep(500);
                }
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
        }
    }


    class Consumer implements Runnable{
        private int cid = 0;

        public Consumer(int cid){
            this.cid = cid;
        }

        public void run(){
            try {
                while (!Thread.currentThread().isInterrupted()) {


                    lock.lock();

                    while (data.isEmpty()) {
                        System.out.println("Consumer" + cid + " waiting, data size : " + data.size());
                        notEmpty.await();
                    }

                    try{
                        int pid = data.remove(0);
                        notFull.signal();
                        System.out.println("Consumer" + cid + " consuming data " + pid +" data size : " + data.size());

                    }finally {
                        lock.unlock();
                    }

                    Thread.sleep(500);
                }
            }catch (InterruptedException ie){
                ie.printStackTrace();
            }
        }
    }


    public void start(){



        ExecutorService executor = Executors.newCachedThreadPool();

        for(int i = 0; i < 5; ++ i){
            executor.submit(new Producer(i));
            executor.submit(new Consumer(i));
        }

        try {
            Thread.sleep(10*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        executor.shutdownNow();
    }


    public static void main(String []args){

        new ProducerAndConsumer2().start();

    }


}
查看评论

kafka集群搭建和使用Java写kafka生产者消费者

http://czj4451.iteye.com/blog/2041096 1 kafka集群搭建   Java代码   1.zookeeper集群  搭建在110, 111,112 ...
  • xj626852095
  • xj626852095
  • 2016-06-19 08:52:37
  • 9441

Java并行编程-lock中使用多条件condition(生产者消费者模式实例)

Java 并发包下的提供Lock,Lock相对于Synchronized可以更好的解决线程同步问题,更加的灵活和高效,并且ReadWriteLock锁还能实现读、写的分离。但线程间仅仅互斥是不够的,还...
  • chenchaofuck1
  • chenchaofuck1
  • 2016-06-05 23:37:27
  • 8986

利用Condition实现生产者和消费者资源共享

啥都不说,直接上代码。 公共资源: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Loc...
  • chenwiehuang
  • chenwiehuang
  • 2017-02-17 18:10:15
  • 127

生产者-消费者问题(condition)Java实现

 package book.j2se5;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executor...
  • wuhailin2005
  • wuhailin2005
  • 2009-01-08 18:31:00
  • 814

使用Lock来实现生产者和消费者问题

Lock的await/singal 和 Object的wait/notify 的区别 在使用Lock之前,我们都使用Object 的wait和notify实现同步的。举例来说,一个producer和...
  • lingzhm
  • lingzhm
  • 2015-08-22 21:54:04
  • 1926

基于Lock+Condition实现生产者消费者模式

package demo; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks....
  • chengyuqiang
  • chengyuqiang
  • 2018-01-27 17:47:00
  • 77

使用java Condition构建生产者消费者

1.Condition介绍在上一篇文章中曾经提到对象的wait和notify方法,condition类其实就是这种方法的一种替代性产物。 Condition对象是同Lock结合使用,由Lock进行创...
  • YouMengJiuZhuiBa
  • YouMengJiuZhuiBa
  • 2015-11-18 21:49:19
  • 650

NSCondition实现生产者消费者模式

使用NSCondition对象来控制进程的同步,通过NSCondition对象的操作实现进程间的通信。NSCondition也实现了NSLocking协议,因此也可以调用lock、 unlock来实现...
  • codebat
  • codebat
  • 2014-11-11 11:20:05
  • 1573

用Condition条件变量实现生产者消费者模式

import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurren...
  • jb_peng
  • jb_peng
  • 2016-04-01 17:40:09
  • 897

Thinking in Java---线程通信+三种方式实现生产者消费者问题

前面讲过线程之间的同步问题;同步问题主要是为了保证对共享资源的并发访问不会出错,主要的思想是一次只让一个线程去访问共享资源,我们是通过加锁的方法实现。但是有时候我们还需要安排几个线程的执行次序,而在系...
  • acm_lkl
  • acm_lkl
  • 2015-08-31 20:31:00
  • 1127
    个人资料
    等级:
    访问量: 6万+
    积分: 1462
    排名: 3万+
    最新评论