`

多线程 生产者和消费者模式

阅读更多

 

package com.hupun.crm.test.thread.pattern;

 

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.LinkedBlockingQueue;

 

/**

 * 阻塞队列BlockingQueue

 * 

 * 下面是用BlockingQueue来实现Producer和Consumer的例子

 */

public class BlockingQueueTest2 {

 

/**

* 定义装苹果的篮子

*/

public static class Basket {

// 篮子,能够容纳3个苹果

// BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);

BlockingQueue<String> basket = new LinkedBlockingQueue<String>(3);

 

// 生产苹果,放入篮子

public void produce() throws InterruptedException {

// put方法放入一个苹果,若basket满了,等到basket有位置

basket.put("An apple");

}

 

// 消费苹果,从篮子中取走

public String consume() throws InterruptedException {

// get方法取出一个苹果,若basket为空,等到basket有苹果为止

return basket.take();

}

}

 

//  测试方法

public static void testBasket() {

 

// 建立一个装苹果的篮子

final Basket basket = new Basket();

 

// 定义苹果生产者

class Producer implements Runnable {

public String instance = "";

 

public Producer(String a) {

instance = a;

}

 

public void run() {

try {

while (true) {

// 生产苹果

System.out.println("生产者准备生产苹果:" + instance);

basket.produce();

System.out.println("! 生产者生产苹果完毕:" + instance);

// 休眠300ms

Thread.sleep(300);

}

} catch (InterruptedException ex) {

}

}

}

 

// 定义苹果消费者

class Consumer implements Runnable {

public String instance = "";

 

public Consumer(String a) {

instance = a;

}

 

public void run() {

try {

while (true) {

// 消费苹果

System.out.println("消费者准备消费苹果:" + instance);

basket.consume();

System.out.println("! 消费者消费苹果完毕:" + instance);

// 休眠1000ms

Thread.sleep(1000);

}

} catch (InterruptedException ex) {

}

}

}

 

ExecutorService service = Executors.newCachedThreadPool();

Producer producer = new Producer("P1");

Producer producer2 = new Producer("P2");

Producer producer3 = new Producer("P3");

Consumer consumer = new Consumer("C1");

service.submit(producer);

service.submit(producer2);

service.submit(producer3);

service.submit(consumer);

 

// 程序运行3s后,所有任务停止

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

}

 

service.shutdownNow();

}

 

public static void main(String[] args) {

BlockingQueueTest2.testBasket();

}

}

 

转自:http://www.oschina.net/code/snippet_113883_12675

 

----------------------------------------

 

简单的队列缓存区实现:
public class Queue <E>{
    private List<E> queue = new ArrayList<E>();
    private int max;
    
    public Queue() {
        super();
        max=100;
    }

    public Queue(int max) {
        super();
        this.max = max;
    }

    public synchronized void produce(E e) {
        while(true){
            if(queue.size()>=max){
                try {
                    wait();
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }else{
                break;
            }
        }
        queue.add(e);
        notifyAll();
    }
    
    public synchronized E consume() {
        E result = null;
        while(true){
            if(queue.size()<=0){
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else{
                result = queue.remove(0);
                notifyAll();
                break;
            }
        }
        return  result;
    }
}

 

====================================

环形缓冲区实现:
public class CircularBuf {
    int NMAX = 1000;

    int iput = 0; // 环形缓冲区的当前放人位置

    int iget = 0; // 缓冲区的当前取出位置

    int n = 0; // 环形缓冲区中的元素总数量

    Object buffer[];
    
    public CircularBuf() {
        super();
        buffer = new Object[NMAX];
    }

    public CircularBuf(int nmax) {
        super();
        NMAX = nmax;
        buffer = new Object[NMAX];
    }

    /*
     * 环形缓冲区的地址编号计算函数,,如果到达唤醒缓冲区的尾部,将绕回到头部。
     * 
     * 环形缓冲区的有效地址编号为:0到(NMAX-1)
     * 
     */
    public int addring(int i) {
        return (i + 1) == NMAX ? 0 : i + 1;
    }

    /* 从环形缓冲区中取一个元素 */
    public synchronized Object get() {
        int pos;
        while (true) {
            if (n > 0) {
                pos = iget;
                iget = addring(iget);
                n--;
                // System.out.println("get-->" + buffer[pos]);
                notifyAll();
                return buffer[pos];

            } else {
                // System.out.println("Buffer is Empty");
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }

    }

    /* 向环形缓冲区中放人一个元素 */
    public synchronized void put(Object z) {

        while (true) {
            if (n < NMAX) {
                buffer[iput] = z;
                // System.out.println("put<--" + buffer[iput]);
                iput = addring(iput);
                n++;
                notifyAll();
            } else {
                // System.out.println("Buffer is full");
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }
}

 

转自:http://shilei78.blog.163.com/blog/static/76004198201052863720488/

分享到:
评论

相关推荐

    java多线程实现生产者和消费者

    通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。

    生产者和消费者模式多线程

    生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    Java多线程 生产者-消费者模式

    总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...

    Linux 多线程实现生产者消费者模式.pdf

    Linux多线程实现生产者消费者模式涉及到操作系统中的多个重要知识点,包括多线程编程、生产者消费者模型、互斥量、条件变量等。在Linux环境下,这些功能可以通过POSIX线程(pthread)库来实现。下面详细解释这些知识...

    多线程生产者消费者模式

    通过以上步骤,我们可以在Delphi中实现一个多线程生产者消费者模式的应用。这种模式在处理大量数据输入和输出,以及需要高效利用系统资源的场景下尤其有用,如数据库导入导出、实时数据处理和网络通信等。理解并熟练...

    c#多线程之生产者消费者

    综上所述,C#中的生产者消费者模式涉及线程同步、数据结构、异常处理等多个知识点,理解和熟练运用这些概念对于编写高效、可靠的并发程序至关重要。通过实践和优化,我们可以创建出能充分利用多核处理器能力、运行...

    java 多线程 生产者消费者模式

    Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...

    生产者-消费者多线程处理

    在Java中,可以使用`BlockingQueue`接口来实现生产者-消费者模式,它已经内置了线程安全的队列操作。生产者可以使用`offer()`方法添加元素,消费者则用`take()`方法取出元素,这两个方法会自动处理等待和唤醒操作。 ...

    多线程实现生产者消费者

    8. **死锁和饥饿**:在实现多线程生产者消费者模型时,必须警惕可能出现的死锁和饥饿问题。死锁是两个或更多线程相互等待对方释放资源导致的僵局,而饥饿则是指某一线程因为资源分配不公平而无法获得执行的机会。...

    java多线程(生产者与消费者)

    2. **资源共享**:在生产者消费者模式中,数据的生产和消费都需要访问一个公共的数据结构,比如一个队列。这个队列就是共享资源,需要被合理地管理和控制。Java提供了多种数据结构,如ArrayBlockingQueue,...

    java 多线程 生产者消费者模式源码

    java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`&lt;thread&gt;`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...

    QT/C++多线程练习:单生产者多消费者(源码)

    涉及 线程创建与退出、线程暂停、父子线程之前以及兄弟线程之间的参数和信号传递、多线程的以及多线程的管理。要求是练习的demo对于以上的点只要涉及基础即可。 主线程、生产者线程(一)、消费者管理线程(一)、...

    多线程_生产者与消费者模式示例

    在IT领域,多线程是并发编程中的一...通过理解和熟练掌握生产者消费者模式,开发者能够更好地解决并发环境下的数据处理问题,提高系统的并行性和效率。同时,结合线程池的使用,可以进一步优化资源管理,提升系统性能。

    操作系统课程设计多线程 生产者消费者问题

    综上所述,这个"操作系统课程设计多线程 生产者消费者问题"项目将涵盖Java多线程编程、并发控制、线程安全的数据结构和通信机制等多个重要知识点,对理解并发编程有极大的实践价值。在实际操作中,需要综合运用这些...

    生产者 消费者 模式 c++

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...

    多线程模拟实现生产者/消费者模型

    生产者/消费者模型是多线程编程中的一个经典设计模式,它有效地利用了资源,避免了数据竞争和阻塞问题。这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品...

    多线程实例,关于生产者与消费者的问题

    "生产者-消费者问题"是多线程编程中一个经典的同步问题,它涉及到资源的共享和线程间的协作。这个问题的核心在于如何有效地协调生产者线程(负责生产数据)和消费者线程(负责消费数据),使得生产与消费的过程既...

Global site tag (gtag.js) - Google Analytics