Java 杂谈java多线程

Java 多线程(十):DelayQueue、PriorityB

2018-07-11  本文已影响26人  聪明的奇瑞

PriorityBlockingQueue

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Main {
    public static void main(String[] args) throws Exception{
        PriorityBlockingQueue<Person> queue = new PriorityBlockingQueue<Person>(3,((o1, o2) -> {
            if(o1.getAge() > o2.getAge())
                return 1;
            else if(o1.getAge()<o2.getAge())
                return -1;
            return 0;
        }));
        queue.put(new Person("a",3));
        queue.put(new Person("b",1));
        queue.put(new Person("c",2));
        System.out.println(queue.take());
        System.out.println(queue.take());
        System.out.println(queue.take());
    }
}

DelayQueue

public class DelayedElement implements Delayed {

    private long delay; //延迟时间
    private long expire;  //到期时间
    private int number;   //值
    private long now; //创建时间

    public DelayedElement(long delay, int number) {
        this.delay = delay;
        this.number = number;
        expire = System.currentTimeMillis() + delay;    //到期时间 = 当前时间+延迟时间
        now = System.currentTimeMillis();
    }

    /**
     * 需要实现的接口,获得延迟时间   用过期时间-当前时间
     */
    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    /**
     * 用于延迟队列内部比较排序   
     */
    @Override
    public int compareTo(Delayed o) {
        DelayedElement delayedElement = (DelayedElement) o;
        return this.number - ((DelayedElement) o).getNumber();
    }

    public int getNumber() {
        return number;
    }

    @Override
    public String toString() {
        return "DelayedElement{" +
                "delay=" + delay +
                ", expire=" + expire +
                ", number=" + number +
                ", now=" + now +
                '}';
    }
}
public class Main2 {
    public static void main(String[] args) throws Exception{
        DelayQueue delayQueue = new DelayQueue();

       DelayedElement d1 = new DelayedElement(1000,1);
       DelayedElement d2 = new DelayedElement(1000,3);
       DelayedElement d3 = new DelayedElement(1000,2);

       delayQueue.put(d1);
       delayQueue.put(d2);
       delayQueue.put(d3);

       System.out.println(delayQueue.take());
        System.out.println(delayQueue.take());
        System.out.println(delayQueue.take());
    }
}

SynchronousQueue

public class Main2 {
    public static void main(String[] args) {
        SynchronousQueue<String> syncQueue = new SynchronousQueue<>();

        new Thread(()->{
            try {
                syncQueue.put("a");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(()->{
            try {
                System.out.println(syncQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读