zoukankan      html  css  js  c++  java
  • Java Consumer and Producer demo

    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呢?

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

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

    Looking for a job working at Home about MSBI
  • 相关阅读:
    [原创]在使用SDK 23(6.0)版本后org.apache.http相关的类找不到的解决办法
    [原创] Gradle DSL method not found: 'android()' 和 buildToolsVersion is not specified 的解决办法。
    [原创]Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析
    访问https接口报错 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系
    js for循环中延迟 setTimeout
    ABP框架扩展AbpSession
    web在线查看PDF文件
    web在线预览office文件
    sql server游标读取excel文件数据,更新到指定表中
    echarts图形销毁重新绘制
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/4288778.html
Copyright © 2011-2022 走看看