BlockingQueue
ArrayBlockingQueue
LinkedBlockingQueue
线程间通信的方式:
公共变量共享
消息队列
线程同步:
synchronized和Lock
消息队列
1. BlockingQueue接口
是一种线程间通信方法
1.1. 接口主要方法
put、take一对阻塞存取;add、poll一对非阻塞存取
插入方法:
1. boolean add(E e): 把一个Object加到BlockingQueue里,如果BlockingQueue可以容纳,则返回true,否则抛出IllegalStateException
2. boolean offer(E e): 如果可能的话,将一个Object加到BlockingQueue,如果BlockingQueue可以容纳,则返回true,否则返回false
3. void put(E e): 把一个object加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻塞,知道BlockingQueue里面有空间再继续。
读取:
1. E poll(long timeout, TimeUnit unit): 取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
2. E take(): 取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象加入为止
其他:
1. int remainingCapacity(): 返回队列剩余的容量,在队列插入和获取的时候,数据不准确
2. boolean remove(Object o): 从对移除元素,如果存在,即移除一个或者更多,队列改变了返回true
3. boolean contains(object o): 如果此队列包含指定的元素,则返回true
4. int drainTo(Collection<? super E> c): 移除此队列中所有可用的元素,并将它们添加到给定collection中。
5. int drainTo(Collection<? super E> c, int maxElements); 和4方法区别在于,指定了移动的数量。
1.2. BlockingQueue实现类
主要有两个常用的实现类:
1. ArrayBlockingQueue:一个有数组支持的有界阻塞队列,规定大小的BlockingQueue,其结构函数必须带一个int参数来指明其大小,其所含的对象是以FIFO顺序排列的
2. LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO顺序排序的。 其中主要用到put()和take()阻塞方法。
2. 测试BlockingQueue
测试代码可以制造一个生产者和一个消费者,用主程序控制。
生产者启动多个线程,每个线程调用构造函数传递BlockingQueue 对象,往queue中写入县城名字
消费者线程调用构造函数传递同样的queue,阻塞读取queue中的生产者线程写入的线程名
代码略
3. JMS
JMS:Java Message Service
不同主机或者进程间的通信机制
网友评论