「Java轮询队列」队列 java

博主:adminadmin 2022-12-15 17:54:05 79

今天给各位分享Java轮询队列的知识,其中也会对队列 java进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

用java语言设计顺序循环队列类

代码如下:

import java.io.Serializable;

import java.util.Arrays;

public class LoopQueueT implements Serializable {

/**

 * @Fields serialVersionUID : TODO

 */

private static final long serialVersionUID = -3670496550272478781L;

private int DEFAULT_SIZE = 10;

private int capacity;// 保存数组的长度

private Object[] elementData;// 定义一个数组用于保存循环队列的元素

private int front = 0;// 队头

private int rear = 0;// 队尾

// 以默认数组长度创建空循环队列

public LoopQueue() {

capacity = DEFAULT_SIZE;

elementData = new Object[capacity];

}

// 以一个初始化元素来创建循环队列

public LoopQueue(T element) {

this();

elementData[0] = element;

rear++;

}

/**

 * 以指定长度的数组来创建循环队列

 * 

 * @param element

 *            指定循环队列中第一个元素

 * @param initSize

 *            指定循环队列底层数组的长度

 */

public LoopQueue(T element, int initSize) {

this.capacity = initSize;

elementData = new Object[capacity];

elementData[0] = element;

rear++;

}

// 获取循环队列的大小

public int size() {

if (isEmpty()) {

return 0;

}

return rear  front ? rear - front : capacity - (front - rear);

}

// 插入队列

public void add(T element) {

if (rear == front  elementData[front] != null) {

throw new IndexOutOfBoundsException("队列已满的异常");

}

elementData[rear++] = element;

// 如果rear已经到头,那就转头

rear = rear == capacity ? 0 : rear;

}

// 移除队列

public T remove() {

if (isEmpty()) {

throw new IndexOutOfBoundsException("空队列异常");

}

// 保留队列的rear端的元素的值

T oldValue = (T) elementData[front];

// 释放队列的rear端的元素

elementData[front++] = null;

// 如果front已经到头,那就转头

front = front == capacity ? 0 : front;

return oldValue;

}

// 返回队列顶元素,但不删除队列顶元素

public T element() {

if (isEmpty()) {

throw new IndexOutOfBoundsException("空队列异常");

}

return (T) elementData[front];

}

// 判断循环队列是否为空队列

public boolean isEmpty() {

// rear==front且rear处的元素为null

return rear == front  elementData[rear] == null;

}

// 清空循环队列

public void clear() {

// 将底层数组所有元素赋为null

Arrays.fill(elementData, null);

front = 0;

rear = 0;

}

public String toString() {

if (isEmpty()) {

return "[]";

} else {

// 如果front  rear,有效元素就是front到rear之间的元素

if (front  rear) {

StringBuilder sb = new StringBuilder("[");

for (int i = front; i  rear; i++) {

sb.append(elementData[i].toString() + ", ");

}

int len = sb.length();

return sb.delete(len - 2, len).append("]").toString();

}

// 如果front = rear,有效元素为front-capacity之间、0-front之间的

else {

StringBuilder sb = new StringBuilder("[");

for (int i = front; i  capacity; i++) {

sb.append(elementData[i].toString() + ", ");

}

for (int i = 0; i  rear; i++) {

sb.append(elementData[i].toString() + ", ");

}

int len = sb.length();

return sb.delete(len - 2, len).append("]").toString();

}

}

}

public static void main(String[] args) {

LoopQueueString queue = new LoopQueueString("aaaa", 3);

// 添加两个元素

queue.add("bbbb");

queue.add("cccc");

// 此时队列已满

System.out.println(queue);

// 删除一个元素后,队列可以再多加一个元素

queue.remove();

System.out.println("删除一个元素后的队列:" + queue);

// 再次添加一个元素,此时队列又满

queue.add("dddd");

System.out.println(queue);

System.out.println("队列满时的长度:" + queue.size());

// 删除一个元素后,队列可以再多加一个元素

queue.remove();

// 再次加入一个元素,此时队列又满

queue.add("eeee");

System.out.println(queue);

}

}

java 用什么实现 FIFO队列?

java使用数据结构来实现FIFO先进先出的队列,实例如下:

/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */

package linkedlisttest;

import java.util.ArrayList;

import java.util.Deque;

import java.util.LinkedList;

import java.util.List;

/**

 *

 * @author Vicky.H

 * @email eclipser@163.com

 */

public class FIFOTest {

    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

        FIFOA fifo = new FIFOImplA(5);

        for (int i = 0; i  20; i++) {

            A a = new A("A:" + i);

            A head = fifo.addLastSafe(a);

            System.out.println(i + "\thead:" + head + "\tsize:" + fifo.size());

        }

        System.out.println("---------------");

        System.out.println("弹出数据");

        ListA polls = fifo.setMaxSize(3);

        for (A a : polls) {

            System.out.println("\thead:" + a);

        }

        

        System.out.println("剩余数据");

        for (A a : fifo) {

            System.out.println("\thead:" + a);

        }

        System.out.println(fifo.size());

    }

}

interface FIFOT extends ListT, DequeT, Cloneable, java.io.Serializable {

    /**

     * 向最后添加一个新的,如果长度超过允许的最大值,则弹出一个 *

     */

    T addLastSafe(T addLast);

    /**

     * 弹出head,如果Size = 0返回null。而不同于pop抛出异常

     * @return 

     */

    T pollSafe();

    /**

     * 获得最大保存

     *

     * @return

     */

    int getMaxSize();

    /**

     * 设置最大存储范围

     *

     * @return 返回的是,因为改变了队列大小,导致弹出的head

     */

    ListT setMaxSize(int maxSize);

}

class FIFOImplT extends LinkedListT implements FIFOT {

    private int maxSize = Integer.MAX_VALUE;

    private final Object synObj = new Object();

    public FIFOImpl() {

        super();

    }

    public FIFOImpl(int maxSize) {

        super();

        this.maxSize = maxSize;

    }

    @Override

    public T addLastSafe(T addLast) {

        synchronized (synObj) {

            T head = null;

            while (size() = maxSize) {

                head = poll();

            }

            addLast(addLast);

            return head;

        }

    }

    @Override

    public T pollSafe() {

        synchronized (synObj) {

            return poll();

        }

    }

    @Override

    public ListT setMaxSize(int maxSize) {

        ListT list = null;

        if (maxSize  this.maxSize) {

            list = new ArrayListT();

            synchronized (synObj) {

                while (size()  maxSize) {

                    list.add(poll());

                }

            }

        }

        this.maxSize = maxSize;

        return list;

    }

    @Override

    public int getMaxSize() {

        return this.maxSize;

    }

}

class A {

    private String name;

    public A() {

    }

    public A(String name) {

        this.name = name;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    @Override

    public String toString() {

        return "A{" + "name=" + name + '}';

    }

}

求解答java Time schedule()方法真能实现线程的精确延时触发吗?

如果是要保证的准确性还是考虑一下spring的quartz(所谓的spring定时器org.springframework.scheduling.quartz.* 工具包)或真直接调用第三方式具类org.quartz。至少你说的那个jdk自带的java.util.* 工具包实现。这两个实现原理都应该是依赖jvm环境与系统时间,但是你所说的按时间片这个概念还真没接触过。本人对这个所谓有的中央控制器对时间咋控的还真不了妥。不过我们是做软件的,只要压力测试都能保证轮询时间与系统是一致的,还要考虑那么远么?

关于Java轮询队列和队列 java的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-15,除非注明,否则均为首码项目网原创文章,转载请注明出处。