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

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

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

时间: 2024-12-19 02:16:55

Java Consumer and Producer demo的相关文章

golang for thread channel routine consumer and producer

package main import "time" func testThread(){ i:=3 go func(a int){ println(a) println("this is go func!") }(i) time.Sleep(1*time.Second) println("hello main thread!") } func testChannel(){ //read write channel ch:=make(chan i

Kafka Java consumer动态修改topic订阅

前段时间在Kafka QQ群中有人问及此事--关于Java consumer如何动态修改topic订阅的问题.仔细一想才发现这的确是个好问题,因为如果简单地在另一个线程中直接持有consumer实例然后调用subscribe进行修改,consumer端必然会抛出异常ConcurrentModificationException:KafkaConsumer is not safe for multi-threaded access 和KafkaProducer不同的是,KafkaConsumer不

Java框架JSON-RPC项目demo代码实战

原创整理不易,转载请注明出处:Java框架JSON-RPC项目demo代码实战 代码下载地址:http://www.zuidaima.com/share/1781535155162112.htm 一.JSON-RPC-Java简介 JSON-RPC-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码.JSON-RPC-Java可运行在Servlet容器中如Tomc

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

在利用 Spring 对 thrift 进行集成时,出现错误: avax.servlet.ServletException: Servlet.init() for servlet search-nlp-service threw exception org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReport

java 生产者和消费者demo

1 package com.benq; 2 3 import java.util.*; 4 import java.util.concurrent.TimeUnit; 5 6 public class HH { 7 public static void main(String[] args){ 8 9 var store=new MyStore<Integer>(20); 10 11 for(int i=0;i<10;i++){ 12 var producer=new Procuder&

java使用kafka创建demo

1.创建java项目.在pom.xml文件中添加 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.10.2.0</version> </dependency> 2.创建生产者代码 import java.util.Properties; import org.ap

【Java学习系列】第1课--Java环境搭建和demo运行

本文地址 分享提纲: 1. java环境的搭建 2. java demo代码运行 3.参考文档 本人是PHP开发者,一直感觉Java才是程序的王道(应用广,科班出身),所以终于下决心跟一跟. 主要是给自己看和一些java小白参考,大神勿喷. 1. java环境的搭建 请参考 Java 开发环境配置(菜鸟教程) 1)[Windows环境]windows环境下 java环境的搭建(todo) 2)[Linux环境]Linux环境下 java环境搭建(todo) 3)[Mac环境]Mac环境下 jav

java SSL 简单操作demo

当下的web应用好多都转到了https,有时候需要利用java发送https请求,但是呢服务器有证书,又没有好的办法得到服务器证书,一般会自定义jsse里的信任管理器,让客户端不验证服务器的证书的有效性,此方法一般就叫绕过证书之类的,下面给一个参考demo: import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.security.NoSuchAlgorit

[Java] 第一个Spring Demo

1  Spring关键字: DI:Dependency Injection,依赖注入.依赖指的是调用关系.A调用B则A依赖于B.注入指的是A不再new B对象,而是由Spring容器来注入B对象. IoC:控制反转,对象不再由调用者来new,而是把new对象的任务交给Spring容器,Spring从XML中读取对象的属性值. AOP:面向切面变成(区别于面向对象编程OOP).so,切面是什么?一些公共行为? DAI:Spring整合了针对多种数据库的访问方式(含JDBC.OXM等) 框架融合:可