`
landyer
  • 浏览: 141901 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用BlockingQueue来简化消费者与生产者的问题

    博客分类:
  • java
 
阅读更多

 

这个是消费者类

 

import java.util.concurrent.BlockingQueue;

public class ConsumerBlockingQueue extends Thread {

    private final BlockingQueue<Integer> queue;
    private final String name;
    
    public ConsumerBlockingQueue(BlockingQueue<Integer> q, String name)
    {
        queue=q;
        this.name=name;
    }
    public void run() {
        // TODO Auto-generated method stub
        try
        {
            while(true)
            {
                consume(queue.take());
                try
                {
                    sleep(800);// 将消费者的睡眠时间设置得比生产者小是为了演示当产品列表为空的情形
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    private void consume(int i)
    {
        System.out.println(name+" consume "+i);
    }

}
 

这个是生产者类

 

public class ProducerBlockingQueue extends Thread{
    
    private final BlockingQueue<Integer> queue;
    private final String name;
    private static int i=0;
    public ProducerBlockingQueue(BlockingQueue<Integer> q, String name)
    {
        queue=q;
        this.name=name;
    }
    
    public void run() {
        // TODO Auto-generated method stub
        try
        {
            while(true)
            {
                queue.add(produce());
                try
                {
                    sleep(1000);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
                
        }catch(Exception e){
            e.printStackTrace();
        }

    }
    
    private int produce()
    {
        System.out.println(name+" producing "+i);
        return i++;
    }

}
 

我们定义一个Queue来实现BlockingQueue

import java.util.*;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

public class Queue implements BlockingQueue {

    private List list=new ArrayList();
    public boolean add(Object o) {
        // TODO Auto-generated method stub
        list.add(o);
        return true;
    }

    public Object take() throws InterruptedException {
        // TODO Auto-generated method stub
        while(isEmpty()){}
        return list.remove(0);
    }


    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return list.isEmpty();
    }

// 当然这个类还有其他的方法需要实现,为了清楚起见,我把使用默认实现的方法都去掉了。

}
 

下面我们来测试下

import java.util.concurrent.BlockingQueue;


public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BlockingQueue<Integer> q=new Queue();
        ProducerBlockingQueue p=new ProducerBlockingQueue(q,"p");
        ProducerBlockingQueue p1=new ProducerBlockingQueue(q,"p1");
        ConsumerBlockingQueue c=new ConsumerBlockingQueue(q,"c");
        ConsumerBlockingQueue c1=new ConsumerBlockingQueue(q,"c1");
        p.start();
        p1.start();
        c.start();
        c1.start();
    }

}
 

看到没有,就这么简单,以很少的逻辑代码实现了消费者与生产者功能,当然你还可以对他进行扩充,让他更加完善。

 

 

 

 

 

分享到:
评论

相关推荐

    消费者与生产者问题

    在Java中,我们可以使用`BlockingQueue`接口及其实现,如`ArrayBlockingQueue`,来简化消费者与生产者问题的实现。`BlockingQueue`提供了线程安全的队列操作,当队列为空时,`take()`方法会阻塞消费者线程,直到有新...

    java生产者消费者问题

    Java生产者消费者问题是多线程编程中的一个经典问题,它主要涉及到线程间的协作与通信。在并发编程中,生产者负责生成数据,而消费者则负责处理这些数据。为了解决生产者和消费者之间的问题,Java提供了一系列的同步...

    java 生产者消费者问题(源码)

    通过这个例子,我们可以看到Java的并发工具如`BlockingQueue`是如何简化生产者消费者问题的解决方案的。这种设计模式在多线程应用程序中非常常见,例如在消息队列、任务调度等场景。理解并熟练掌握这一概念对于提升...

    生产者/消费者模式 阻塞队列 LinkedBlockingQueue

    同时,作为阻塞队列,当生产者尝试向满队列添加元素时,或者消费者尝试从空队列中获取元素时,线程会被阻塞,直到队列有可用空间或数据,这大大简化了多线程同步的问题。 在生产者/消费者模式中,生产者通常通过`...

    Java 生产者消费者模式

    在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...

    生产者消费者问题 Java

    总之,这个项目通过Java的多线程和`BlockingQueue`,实现了生产者消费者问题的直观演示,无论是在GUI界面还是命令行环境中都能运行。对于学习Java并发编程和理解线程同步机制的人来说,这是一个非常有价值的实践案例...

    生产者与消费者问题.docx

    在本篇文章中,我们将重点探讨使用Java语言实现生产者与消费者问题的几种方法。 #### 二、生产者与消费者问题描述 在一个典型的生产者与消费者模型中,存在两个角色:生产者和消费者。生产者负责生成数据并将这些...

    Java生产者与消费者

    在实际应用中,Java提供了更高级的并发工具类,如`BlockingQueue`,它已经内置了线程安全和阻塞操作,可以简化生产者与消费者模式的实现,提高代码的可读性和可维护性。例如,我们可以使用`ArrayBlockingQueue`作为...

    JAVA死锁and生产者消费者问题

    `ProducerConsumer.java`文件可能提供了使用`BlockingQueue`接口实现生产者消费者的示例,`BlockingQueue`已经内置了线程安全的特性,可以自动处理满和空的情况,简化了同步代码。 生产者消费者问题的解决方案通常...

    Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析

    总的来说,`Java`的`BlockingQueue`是实现并发和多线程间数据共享的有效工具,它通过阻塞机制提供了高效且线程安全的通信途径,尤其在处理生产者-消费者问题时,大大简化了编程复杂性。了解并熟练掌握`BlockingQueue...

    android 生产者消费者模式

    在实际使用中,生产者-消费者模式可以通过`BlockingQueue`来简化实现。`BlockingQueue`是一个线程安全的数据结构,它提供了在满时阻塞生产者、空时阻塞消费者的能力,这样可以避免无谓的资源浪费,同时简化同步代码...

    producer-java.rar_java 生产者 消费者_java 生产者消费者_producer.java_生产者 消费者

    使用`BlockingQueue`可以简化生产者消费者问题的实现,因为它自动处理了线程的阻塞和唤醒。例如,`put()`方法在队列满时会阻塞生产者,而`take()`方法在队列空时会阻塞消费者。 `producer-java.doc`可能包含了关于...

    生产者消费者问题

    以下是使用`ArrayBlockingQueue`实现生产者消费者问题的一个简化示例: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { private final ArrayBlockingQueue...

    Java生产者消费者问题

    在Java编程领域,生产者消费者问题是多线程同步的一个经典示例,它源自并发编程中的一个常见场景。这个问题描述了两个角色:生产者和消费者,它们共享一个有限大小的缓冲区。生产者负责生成数据并将数据放入缓冲区,...

    生产者与消费者源代码

    在IT领域,尤其是在多线程编程中,"生产者与消费者"模式是一个经典的并发问题解决方案。这个模式描述了两个或多个线程之间的交互,其中一方(生产者)生成数据,另一方(消费者)消费这些数据。这个模式在Java中经常...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    线程同步--生产者消费者问题

    在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...

    java版本的生产者与消费者

    在Java编程领域,"生产者与消费者"模式是一种常见的多线程问题解决方案,它涉及到并发编程和线程协作。在这个模式中,生产者负责创建资源,而消费者则负责消费这些资源。这种模式常用于实现缓存、队列和其他数据结构...

    BlockingQueue的使用

    在多线程环境下,BlockingQueue能够有效地实现生产者-消费者模式,提高了程序的并发性能和效率。本文将深入探讨BlockingQueue的使用、特性以及常见操作。 首先, BlockingQueue接口位于`java.util.concurrent`包下...

    由生产者/消费者问题看JAVA多线程

    生产者/消费者问题是一个经典的计算机科学问题,用于展示进程间的通信与同步问题。在这个模型中,生产者负责创建数据并将其放置到共享内存区域(通常是一个缓冲区),而消费者则从该缓冲区读取数据并进行处理。为了...

Global site tag (gtag.js) - Google Analytics