Java通过DelayQueue的实现多线程任务的阻塞队列

DelayQueue

1)java.util.concurrent.DelayQueue 延迟阻塞队列,是一个 有序的无界阻塞队列,只有在延迟期满时才能从中提取元素,该队列的头部为  延迟期满延迟到期时间最久 的Delayed元素;
放置入DelayQueue的元素必须实现Delayed接口;


2)实例代码,实现任务元素的延迟队列:
//定义延迟队列中的任务元素,可以通过extends实现不同的run方法;
class DelayedTask implements Runnable,Delayed{
     private final int delta;   //差值信号:用于记录任务线程的延迟时间;
     private final long trigger;    //触发信号:任务线程在加入队列,延迟期满,即将要执行时的系统时间;
     public DelayedTask(int delayInMilliseconds){
         delta = delayInMilliseconds;
         trigger = System.currentTimeMillis() + (long)delta;  
     }
     public long getDelay(TimeUnit unit){   //提供TimeUnit的时间单位的转换;
          return unit.convert(trigger - System.currentTimeMillis(),MILLISECONDS);
     }
     public void run(){
          ......
     }
}
//定义队列处理完所有的任务后,要执行的任务处理线程(永远在队列的末端,也可以更具需求不实现该类)
class static class EndSentinel extends DelayedTask{
     private ExecutorService exec;
     public EndSentinel(int delay,ExecutorService exec){
          super(delay);
          this.exec = exec;
     }
     public void run(){
          <do something when all DelayedTask are finished>
          exec.shutdown();
     }
     
}

//定义使用整个延迟队列的任务类
class DelayedTaskConsumer implements Runnable{
     private DelayQueue<DelayedTask> queue;
     public DelayTaskConsumer(DelayQueue<DelayedTask> queue){ this.queue = queue; }
     public void run(){
          try{
               if(queue.size() == 0)
                    Thread.interrupt();
               while(!Thread.interrupted())
                    queue.take().run();
          }catch(InterruptedException ex){
          }
          <do something when delayedTask is run successfully>
     }
}
//测试平台
class Driver{
     void main(){
          ExecutorService exec = Executors.newCachedThreadPool();
          DelayQueue<DelayedTask> queue = new DelayQueue<DelayedTask>();
          for(int i=0;i<N;i++)
               queue.put(new DelayedTask(new Random().nextInt()));
         
          exec.execute(new DelayedTaskConsumer(queue));
     }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的DelayQueue是一个特殊的队列,它只允许在指定的延迟时间之后才能从队列中取出元素。可以使用DelayQueue实现一些延迟任务的功能,例如任务调度、缓存过期等。 DelayQueue基于PriorityQueue实现,但是它的元素必须实现Delayed接口,Delayed接口中定义了一个getDelay()方法,返回元素的延迟时间。 当从DelayQueue中取出元素时,如果该元素的延迟时间还没有到达,则该元素会被重新加入队列中,直到延迟时间到达。 以下是一个简单的使用DelayQueue的例子: ```java import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; public class DelayQueueExample { public static void main(String[] args) throws InterruptedException { DelayQueue<DelayedElement> delayQueue = new DelayQueue<DelayedElement>(); delayQueue.add(new DelayedElement("element1", 2000)); delayQueue.add(new DelayedElement("element2", 5000)); delayQueue.add(new DelayedElement("element3", 1000)); while (!delayQueue.isEmpty()) { DelayedElement element = delayQueue.take(); System.out.println("Taking element: " + element); } } static class DelayedElement implements Delayed { private String name; private long delayTime; public DelayedElement(String name, long delayTime) { this.name = name; this.delayTime = System.currentTimeMillis() + delayTime; } @Override public long getDelay(TimeUnit unit) { long diff = delayTime - System.currentTimeMillis(); return unit.convert(diff, TimeUnit.MILLISECONDS); } @Override public int compareTo(Delayed o) { if (this.delayTime < ((DelayedElement) o).delayTime) { return -1; } if (this.delayTime > ((DelayedElement) o).delayTime) { return 1; } return 0; } @Override public String toString() { return "DelayedElement{" + "name='" + name + '\'' + ", delayTime=" + delayTime + '}'; } } } ``` 在上面的例子中,我们创建了一个DelayQueue,并向其中添加了三个DelayedElement元素。每个元素都有一个延迟时间,分别为2秒、5秒和1秒。 在主线程中,我们不断地从DelayQueue中取出元素,直到队列为空。当元素的延迟时间还没有到达时,它会被重新加入队列中,直到延迟时间到达。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值