快速业务通道

驯服Tiger: 并发集合 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
ueue 实现可能是其中最有意思(也是最复杂)的一个。加入到队列中的元素必须实现新的 Delayed 接口(只有一个方法 —— long getDelay(java.util.concurrent.TimeUnit unit) )。因为队列的大小没有界限,使得添加可以立即返回,但是在延迟时间过去之前,不能从队列中取出元素。如果多个元素完成了延迟,那么最早失效/失效时间最长的元素将第一个取出。实际上没有听上去这样复杂。清单 3 演示了这种新的阻塞队列集合的使用:

驯服Tiger: 并发集合(3)

时间:2011-01-31 John Zukowski

清单 3. 使用 DelayQueue 实现

import java.util.*; import java.util.concurrent.*; public class Delay {   /**   * Delayed implementation that actually delays   */   static class NanoDelay implements Delayed {    long trigger;    NanoDelay(long i) {     trigger = System.nanoTime() + i;    }    public int compareTo(Object y) {     long i = trigger;     long j = ((NanoDelay)y).trigger;     if (i < j) return -1;     if (i > j) return 1;     return 0;    }    public boolean equals(Object other) {     return ((NanoDelay)other).trigger == trigger;    }    public boolean equals(NanoDelay other) {     return ((NanoDelay)other).trigger == trigger;    }    public long getDelay(TimeUnit unit) {     long n = trigger - System.nanoTime();     return unit.convert(n, TimeUnit.NANOSECONDS);    }    public long getTriggerTime() {     return trigger;    }    public String toString() {     return String.valueOf(trigger);    }   }   public static void main(String args[]) throws InterruptedException {    Random random = new Random();    DelayQueue queue = new DelayQueue();    for (int i=0; i < 5; i++) {     queue.add(new NanoDelay(random.nextInt(1000)));    }    long last = 0;    for (int i=0; i < 5; i++) {     NanoDelay delay = (NanoDelay)(queue.take());     long tt = delay.getTriggerTime();     System.out.println("Trigger time: " + tt);     if (i != 0) {      System.out.println("Delta: " + (tt - last));     }     last = tt;    }   } }

这个例子首先是一个内部类 NanoDelay ,它实质上将暂停给定的任意纳秒(nanosecond)数,这里利用了 System 的新 nanoTime() 方法。然后 main() 方法只是将 NanoDelay 对象放到队列中并再次将它们取出来。如果希望队列项做一些其他事情,就需要在 Delayed 对象的实现中加入方法,并在从队列中取出后调用这个新方法。(请随意扩展 NanoDelay 以试验加入其他方法做一些有趣的事情。)显示从队列中取出元素的两次调用之间的时间差。如果时间差是负数,可以视为一个错误,因为永远不会在延迟时间结束后,在一个更早的触发时间从队列中取得项。

SynchronousQueue 类是最简单的。它没有内部容量。它就像线程之间的手递手机制。在队列中加入一个元素的生产者会等待另一个线程的消费者。当这个消费者出现时,这个元素就直接在消费者和生产者之间传递,永远不会加入到阻塞队列中。

驯服Tiger: 并发集合(4)

时间:2011-01-31 John Zukowski

使用 ConcurrentMap 实现

新的 java.util.concurrent.ConcurrentMap 接口和 ConcurrentHashMap 实现只能在键不存在时将元素加入到 map 中,只有在键存在并映射到特定值时才能从

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号