SynchronousQueue的简单应用1

来源:互联网 发布:双十一淘宝半价吗 编辑:程序博客网 时间:2024/05/15 03:39

使用jdk的原话:

一种阻塞队列,其中每个 put 必须等待一个take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的 是尝试添加到队列中的首个已排队线程元素;如果没有已排队线程,则不添加元素并且头为null。对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空集合。此队列不允许null 元素。 

同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。 

对于正在等待的生产者和使用者线程而言,此类支持可选的公平排序策略。默认情况下不保证这种排序。但是,使用公平设置为 true 所构造的队列可保证线程以 FIFO 的顺序进行访问。公平通常会降低吞吐量,但是可以减小可变性并避免得不到服务。 

import java.util.Random;import java.util.concurrent.SynchronousQueue;import java.util.concurrent.TimeUnit;public class Test18 {public static void main(String[] args) throws InterruptedException {final SynchronousQueue<Integer> queue = new SynchronousQueue<Integer>();new Thread(new Runnable(){@Overridepublic void run() {try {System.out.println("等待数据传入...");System.out.println("##获取的数据为:"+queue.take());} catch (InterruptedException e) {e.printStackTrace();}}}).start();TimeUnit.SECONDS.sleep(3);//三秒之后传入数据System.out.println("准备传入数据..");queue.offer(new Random().nextInt(1000));}/** * 运行结果: *  等待数据传入...//在这里等待了三秒准备传入数据..##获取的数据为:194 */}


原创粉丝点击