多線程與高併發-併發容器6_5:按照緊迫程度排序的DelayQueue

package com.inspire.juc.c_025;

import java.net.StandardSocketOptions;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class T07_DelayQueue {
    static class MyTask implements Delayed{
        String name;
        long runningTime;
        MyTask(String name,long rt){
            this.name=name;
            this.runningTime=rt;
        }
        @Override
        public long getDelay(TimeUnit unit) {
            return unit.convert(runningTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS);
        }

        @Override
        public int compareTo(Delayed o) {
            if(this.getDelay(TimeUnit.MILLISECONDS)<o.getDelay(TimeUnit.MILLISECONDS)){
                return -1;
            }else if(this.getDelay(TimeUnit.MILLISECONDS)>o.getDelay(TimeUnit.MILLISECONDS)){
                return 1;
            }else {
                return 0;
            }
        }

        @Override
        public String toString() {
            return "MyTask{" +
                    "name='" + name + '\'' +
                    ", runningTime=" + runningTime +
                    '}';
        }
    }
    static BlockingQueue<MyTask> tasks=new DelayQueue<>();
    public static void main(String[] args) throws InterruptedException {
        long now=System.currentTimeMillis();
        MyTask t1=new MyTask("t1",now+5000);
        MyTask t2=new MyTask("t2",now+4000);
        MyTask t3=new MyTask("t3",now+3000);
        MyTask t4=new MyTask("t4",now+2000);
        MyTask t5=new MyTask("t5",now+1000);

        tasks.put(t1);
        tasks.put(t2);
        tasks.put(t3);
        tasks.put(t4);
        tasks.put(t5);
        System.out.println(tasks);
        for (int i = 0; i < 5; i++) {
            System.out.println(tasks.take());
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章