import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;
class producer
{
    Random rdm = new Random();
    void produce( LinkedBlockingQueue<Integer> productlist)
    {
         while(true)
         {
             if(productlist.size()<101)
             {
                 productlist.add(rdm.nextInt(100));
                 System.out.println(Thread.currentThread().getName() +" produce number:" + productlist.peek());
             }
         }
    }
}
class consumer
{
    void consume(LinkedBlockingQueue<?> productlist)
    {
         while(true)
         {
             if(productlist.size()>0)
             {
                 System.out.println(Thread.currentThread().getName() +" consume number:" + productlist.poll());
             }
         }
    }
}

//producer and customer demo
public class ThreadDemo {
    public static void main(String[] args)
    {
        final LinkedBlockingQueue<Integer> productlist = new LinkedBlockingQueue<Integer>();;
        final producer p = new producer();
        new Thread(  new Runnable(){
                    public  void run()
                    {
                         p.produce(productlist);
                    }
                }
                ).start();
        for(int i=1;i<3;i++)
        {
            final consumer c = new consumer();
            new Thread(new Runnable(){
                    public void run()
                    {
                        c.consume(productlist);
                    }
            }).start();
        }
    }
}

one question: 为什么在线程中使用到的外部变量,如p,productlist 等都需要设置成final呢?

同事做了调研,其中一个较为合理的理由是,这个线程后面的其实是一个内部类,而这个内部类引用的这个对象,它是需要自己复制到自己内部的。

而如果它复制的这个对象允许改变指向的对象(或值本身),那么它们就会失去数据的一致性。

Java Consumer and Producer demo的更多相关文章

  1. kafka_2.11-0.8.2.1+java 生产消费程序demo示例

      Kafka学习8_kafka java 生产消费程序demo示例 kafka是吞吐量巨大的一个消息系统,它是用scala写的,和普通的消息的生产消费还有所不同,写了个demo程序供大家参考.kaf ...

  2. 关于Kafka java consumer管理TCP连接的讨论

    本篇是<关于Kafka producer管理TCP连接的讨论>的续篇,主要讨论Kafka java consumer是如何管理TCP连接.实际上,这两篇大部分的内容是相同的,即consum ...

  3. [Kafka] - Kafka Java Consumer实现(一)

    Kafka提供了两种Consumer API,分别是:High Level Consumer API 和 Lower Level Consumer API(Simple Consumer API) H ...

  4. Ext & Java 上存图片 Demo

    Ext & Java 上存图片 Demo Ext <html> <head> <script id="microloader" type=&q ...

  5. Java 多线程异步处理demo

    java中实现多线程 1)继承Thread,重写里面的run方法 2)实现runnable接口通过源码发现:第一种方法说是继承Tread然后重写run方法,通过查看run方法的源码,发现run方法里面 ...

  6. Java 后端微信支付demo

    Java 后端微信支付demo 一.导入微信SDK 二.在微信商户平台下载证书放在项目的resources目录下的cert文件夹下(cert文件夹需要自己建) 三.实现微信的WXPayConfig接口 ...

  7. Kafka Java consumer动态修改topic订阅

    前段时间在Kafka QQ群中有人问及此事——关于Java consumer如何动态修改topic订阅的问题.仔细一想才发现这的确是个好问题,因为如果简单地在另一个线程中直接持有consumer实例然 ...

  8. [Kafka] - Kafka Java Consumer实现(二)

    Kafka提供了两种Consumer API,分别是:High Level Consumer API 和 Lower Level Consumer API(Simple Consumer API) H ...

  9. java.lang.ClassNotFoundException: com.demo.search.extractAbstract.service.ExtractAbstractServiceHandler

    在利用 Spring 对 thrift 进行集成时,出现错误: avax.servlet.ServletException: Servlet.init() for servlet search-nlp ...

随机推荐

  1. 简单使用Dos命令关闭计算机

    作为一个刚进It行业的新手,我比较喜欢搜寻一些对我有帮助的东西,下面是用本机的dos命令关机的例子: 用window+r打开运行窗口,输入cmd,进入控制台,查找关机的相关命令,输入shutdown. ...

  2. solr 学习片段

    全文检索技术——Solr 1 主要内容 1.站内搜索技术选型 2.什么是solr Solr和lucene的区别 3.solr服务器的安装及配置 Solr整合tomcat Solr的演示 4.维护索引 ...

  3. 硅谷新闻2--禁止viewpager预加载

    ContentFragment.java class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { ..... ...

  4. SAP_Web_Service开发配置

    第一章    SAP创建WS 1.1       概要技术说明 1.2       创建RFC函数 1.3       创建WS 1.4       外部系统访问配置 第二章    SAP调用WS 2 ...

  5. SharePoint 2010 文档管理系列之星级评论功能

    前言:正如我们前面介绍的是,文档管理就是让大家更加直观.方便的对手里的文档,进行统筹掌控,哪些文档是有价值的,哪些文档更受大家欢迎,所有就带来了这个星级评论. 当然,这个是SharePoint 201 ...

  6. Microsoft Dynamics CRM 2013 --选项集的多选

    由于从Microsoft Dynamics CRM 2011到Microsoft Dynamics CRM 2013,界面的风格发生了很大的变化 故原先在2011上开发的选项集多选在2013上面已经不 ...

  7. android 类ios actionsheet效果

    1.http://blog.csdn.net/zhaoxy_thu/article/details/17733389 2. https://github.com/ojhariddhish/action ...

  8. Activity与Fragment的生命周期

    今天看到一张图,详细描述了Activity和Fragment的生命周期,好资源共享咯!

  9. 【转】从viewController讲到强制横屏,附IOS5强制横屏的有效办法

    文字罗嗦,篇幅较长,只需营养可直接看红字部分. 一个viewController的初始化大概涉及到如下几个方法的调用: initWithNibName:bundle: viewDidLoad view ...

  10. spring boot 1.4.1 with jsp file sample

    <!--pom.xml--> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...