带有延时的生产者 消费者
最近项目用到了要重新发送数据,看到api中有一个delay queue ,拿过来用一下,做了一个demo。
用到了 DelayQueue Delayed,主要是一个 delayed 接口里面的 getDelay的计算
import java.util.Calendar;import java.util.UUID;import java.util.concurrent.DelayQueue;import java.util.concurrent.Delayed;import java.util.concurrent.TimeUnit;public class DelayMainTest1 {public static void main(String[] args) {DelayQueue<Product> queue = new DelayQueue<Product>();new Thread(new Con1(queue)).start();for(int i = 0;i < 20; i ++){queue.put(new Product(String.valueOf(i)));}}}class Con1 implements Runnable {DelayQueue<Product> queue = new DelayQueue<Product>();public Con1(DelayQueue<Product> queue) {this.queue = queue;}@Overridepublic void run() {while (true) {try {Calendar c = Calendar.getInstance();String str = String.format("尝试取出产品 %tT\t....", c);System.out.println(str);Product p = queue.take();c = Calendar.getInstance();str = String.format("取出产品 %tT\t", c);System.out.println(str + p);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}class Product implements Delayed {String name = "name";String uuid = UUID.randomUUID().toString();long insertTime = System.currentTimeMillis();static int count = 0;int index = 0;public Product(String name) {this.name = name;index = count ++;}@Overridepublic int compareTo(Delayed o) {return (int) (getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));//name.compareTo(p.getName());}@Overridepublic long getDelay(TimeUnit unit) {long tmp = computeDelay(index);return tmp;}public String getName() {return name;}public String getUuid() {return uuid;}public void setName(String name) {this.name = name;}public void setUuid(String uuid) {this.uuid = uuid;}@Overridepublic String toString() {String str = "Product(" + name +"," + uuid + ")" ;return str;}private long computeDelay(long time){///For example, to convert 10 minutes to milliseconds, use: TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES) time = TimeUnit.MILLISECONDS.convert ( time , TimeUnit.SECONDS );long temp = insertTime -System.currentTimeMillis () + time;return temp;}}- 2楼acnt3w昨天 19:37
- http://sungur.wordpress.com/2011/02/10/java-delayqueue-test/n有更好的,现在才发现。。。。
- 1楼Wentasy昨天 11:14
- 顶一个。博主既然采用的是JDK新特性里的线程使用方式,为什么不实现Callable,而采用以前的实现Runnable呢?感觉这样写好怪异。
- Re: acnt3w昨天 18:25
- 回复Wentasyn因为项目中用到了消息队列,每一个消息=都要有自己的延时的发送时间,这里只是做一个demo演示作用。当然用自己最熟悉的方法先写出来了~~