非阻塞队列 普通队列 阻塞队列 学习笔记

参考   http://www.cnblogs.com/dolphin0520/p/3932906.html

package blockthread;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;

public class ThreadBlockingSample {

    private static int size=10;
    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        //List<Integer> queue=new ArrayList<Integer>(size);// change the type you can see the difference between ordinary list, non block queue and blocking queue
        //PriorityQueue<Integer> queue=new PriorityQueue<Integer>(size);//non blocking queue
        ArrayBlockingQueue<Integer> queue=new ArrayBlockingQueue<Integer>(size); //must specify a size
        //LinkedBlockingQueue<Integer> queue=new LinkedBlockingQueue<Integer>(); //max size Integer.MAXVAULE
        //PriorityBlockingQueue<Integer> queue=new PriorityBlockingQueue<Integer>(); // no limit

        Producer producer=new Producer(queue);
        Consumer consumer=new Consumer(queue);
        producer.start();
        consumer.start();
    }

}

class Producer extends Thread implements AddInterface{
    Object o;
    public Producer(Object o){
        this.o=o;
    }
    public void run(){
        System.out.println("Producer begins to add...");
        while(true){
            synchronized(o){
                if(o.getClass().getSimpleName().equals("ArrayList")){
                    List list=(List)o;
                    if(list.size()==10){
                        try {
                            o.wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            o.notify();
                        }
                    }else{
                        add(o,1);
                        o.notify();
                    }

                }else{
                    add(o,1);
                    o.notify();
                }
            }
            System.out.println("release lock to consumer");
        }
    }

    @Override
    public boolean add(Object queue, Integer i) {
        String queue_type=queue.getClass().getSimpleName();
        if(queue_type.equals("ArrayList")){
            List q=(List)queue;
            q.add(i);
            System.out.println(queue_type+" added 1 and left of size "+q.size());
            return true;
        }else if(queue_type.equals("PriorityQueue")){
            PriorityQueue q=(PriorityQueue)queue;
            q.offer(i);
            System.out.println(queue_type+" added 1 and left of size "+q.size());
        }else if(queue_type.equals("ArrayBlockingQueue")){
            ArrayBlockingQueue q=(ArrayBlockingQueue)queue;
            q.offer(i);
            System.out.println(queue_type+" added 1 and left of size "+q.size());
        }else if(queue_type.equals("LinkedBlockingQueue")){
            LinkedBlockingQueue q=(LinkedBlockingQueue)queue;
            q.offer(i);
            System.out.println(queue_type+" added 1 and left of size "+q.size());
        }else if(queue_type.equals("PriorityBlockingQueue")){
            PriorityBlockingQueue q=(PriorityBlockingQueue)queue;
            q.offer(i);
            System.out.println(queue_type+" added 1 and left of size "+q.size());
        }
        return false;
    }

}

class Consumer extends Thread implements MoveInterface{
    Object o;
    public Consumer(Object o){
        this.o=o;
    }
    public void run(){
        System.out.println("consumer begins to move....");
            while(true){
                synchronized(o){
                    if(o.getClass().getSimpleName().equals("ArrayList")){
                        List list=(List)o;
                        if(list.size()==0){
                            try {
                                o.wait();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                o.notify();
                            }
                        }else{
                            move(o);
                            o.notify();
                        }

                    }else{
                        move(o);
                        o.notify();
                    }
                }
                System.out.println("release lock to producer");
        }
    }
    @Override
    public boolean move(Object queue) {
        String queue_type=queue.getClass().getSimpleName();
        if(queue_type.equals("ArrayList")){
            List q=(List)queue;
            q.remove(q.size()-1);
            System.out.println(queue_type+" moved 1 left size "+q.size());
            return true;
        }else if(queue_type.equals("PriorityQueue")){
            PriorityQueue q=(PriorityQueue)queue;
            q.poll();
            System.out.println(queue_type+" moved 1 left size "+q.size());
        }else if(queue_type.equals("ArrayBlockingQueue")){
            ArrayBlockingQueue q=(ArrayBlockingQueue)queue;
            q.poll();
            System.out.println(queue_type+" moved 1 left size "+q.size());
        }else if(queue_type.equals("LinkedBlockingQueue")){
            LinkedBlockingQueue q=(LinkedBlockingQueue)queue;
            q.poll();
            System.out.println(queue_type+" moved 1 left size "+q.size());
        }else if(queue_type.equals("PriorityBlockingQueue")){
            PriorityBlockingQueue q=(PriorityBlockingQueue)queue;
            q.poll();
            System.out.println(queue_type+" moved 1 left size "+q.size());
        }
        return false;
    }

}
时间: 2024-10-07 04:06:08

非阻塞队列 普通队列 阻塞队列 学习笔记的相关文章

Linux程序设计学习笔记----System V进程间通信(信号量)

关于System V Unix System V,是Unix操作系统众多版本中的一支.它最初由AT&T开发,在1983年第一次发布,因此也被称为AT&T System V.一共发行了4个System V的主要版本:版本1.2.3和4.System V Release 4,或者称为SVR4,是最成功的版本,成为一些UNIX共同特性的源头,例如"SysV 初始化脚本"(/etc/init.d),用来控制系统启动和关闭,System V Interface Definitio

wcf 学习笔记1

1. wcf 中的所有消息均为SOAP消息,注意WCF的消息与传输协议无关,与WEB服务不同,因此WCF服务可以在不同的协议之间传输,而不仅限于HTTP 2. wcf的每一个服务都有一个唯一的地址,地址包含两个元素:服务位置和传输协议:服务位置包括机器名,站点,通讯端口,管道或队列,以及一个可选的特定路径或URI统一资源标识 3. wcf 通讯协议有:http ,tcp , peer network , ipc , msmq ,使用命名管道的服务只能接收来自同一台机器的调用,每台机器只能打开一个

Laravel学习笔记目录

伴随自己学习.使用laravel的过程,记录下遇到过的问题与思考.与程序猿们共勉,知识的道路没有止境,我们一直都在学习的路上. 第一部分:入门级 这部分文章写得都是比较浅显的,属于纯粹的使用,我也不知道自己什么时候能够登堂入室.先这么写着吧.后面的项目会用到利用laravel来进行app的服务端开发.到时可能也开一个专栏专门说说app服务端开发的那些事儿. 1. Laravel5学习笔记:Composer.json配置文件说明 2. Laravel5学习笔记:执行route:cache时报Log

struts2学习笔记(一)—— 知识点扫描

一.struts2的核心部件 (1)Configuration (2)Action (3)Interceptor (4)Value Stack / OGNL (5)Result Types (6)Results / View Technology 二.architectural goals: (1)separation  of concerns (2)loose coupling (3)testability (4)modularization (5)convention over config

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列. 注:什么叫线程安全?这个首先要明确.线程安全就是说多线程访问同一代码,不会产生不确定的结果. 并行和并发区别 1.并行是指两者同时执行一件事,比如赛跑,两个人都在不停的

带阻塞读模式的循环队列实现

部门准备开发一个项目,这个项目其中一个模块内部实现需要用到队列来实现各小模块内部通讯, 为了实现高效的数据传输模式,决定放弃轮询的方式,改用阻塞方式实现一个循环队列.后来项目 取消了,但该部分代码也写好测试成功了,不想浪费了,就贴出来提供给有需要的人.所有代码和 测试文档我会打包上传到我的个人空间. 函数说明如下: 所有函数成功返回0,失败返回错误码. 该说明文档只是简要说明该函数库,详细情况,请结合代码. 1.该函数库实现了一个先进先出队列的功能,有如下特点 <1>线程安全,该队列出队入队均

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列,都不能存放null值. 1.BlockingQueue下有两个常用子类LinkedBlockingQueue和ArrayBlockingQueue,内部分链表和数组实现,

java队列Queue及阻塞队列

java队列 接口Queue类在java.util包,定义了以下6个方法 详细查看官方文档https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html 什么是阻塞队列 BlockingQueue 队列是一种数据结构,它的特点是先进先出(First In First Out),它有两个基本操作:在队列尾部加入一个元素,从队列头部移除一个元素.队列在多线程应用中,常用于生产-消费场景. BlockingQueue 是 Java util

Linux程序设计学习笔记----System V进程通信之消息队列

一个或多个进程可向消息队列写入消息,而一个或多个进程可从消息队列中读取消息,这种进程间通讯机制通常使用在客户/服务器模型中,客户向服务器发送请求消息,服务器读取消息并执行相应请求.在许多微内核结构的操作系统中,内核和各组件之间的基本通讯方式就是消息队列.例如,在 MINIX 操作系统中,内核.I/O 任务.服务器进程和用户进程之间就是通过消息队列实现通讯的. Linux中的消息可以被描述成在内核地址空间的一个内部链表,每一个消息队列由一个IPC的标识号唯一的标识.Linux 为系统中所有的消息队

redis 学习笔记三(队列功能)

Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpush Lindex获取一个元素,通过其索引列表 Linsert在列表中的另一个元素之前或之后插入一个元素 Llen获得队列(List)的长度 Lpop从队列的左边出队一个元素 Lpush从队列的左边入队一个或多个元素 Lpushx当队列存在时,从队到左边入队一个元素 Lrange从列表中获取指定返回的