「java队列实现」java队列实现栈

博主:adminadmin 2023-01-22 01:24:09 274

本篇文章给大家谈谈java队列实现,以及java队列实现栈对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

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中怎么实现队列

public class QueueE {

private Object[] data=null;

private int maxSize; //队列容量

private int front; //队列头,允许删除

private int rear; //队列尾,允许插入

//构造函数

public Queue(){

this(10);

}

public Queue(int initialSize){

if(initialSize =0){

this.maxSize = initialSize;

data = new Object[initialSize];

front = rear =0;

}else{

throw new RuntimeException("初始化大小不能小于0:" + initialSize);

}

}

//判空

public boolean empty(){

return rear==front?true:false;

}

//插入

public boolean add(E e){

if(rear== maxSize){

throw new RuntimeException("队列已满,无法插入新的元素!");

}else{

data[rear++]=e;

return true;

}

}

//返回队首元素,但不删除

public E peek(){

if(empty()){

throw new RuntimeException("空队列异常!");

}else{

return (E) data[front];

}

}

//出队

public E poll(){

if(empty()){

throw new RuntimeException("空队列异常!");

}else{

E value = (E) data[front]; //保留队列的front端的元素的值

data[front++] = null; //释放队列的front端的元素

return value;

}

}

//队列长度

public int length(){

return rear-front;

}

}

JAVA如何用队列实现并发?

如果是抢资源,在不作弊的情况下

按照先来先得的规则

,那么比较简单的实现就是队列

,不管请求的并发多高,如果用线程来实现为用户服务,也就是说

来一个人请求资源那么就启动一个线程,那CPU执行线程总是有顺序的,比如

当前三个人(路人甲路人乙路人丙)请求A资源

,那服务端就起了三个线程为这三个人服务,假设

这三个人不太幸运在请求的时候没有及时的获得CPU时间片,那么他们三个相当于公平竞争CPU资源,而CPU选择运行线程是不确定顺序的

,又假设

选中了路人丙的线程运行那么将其放入队列就好了,路人乙,路人丙以此类推

,那可能会想为什么不及时的处理呢

,因为后续的操作可能是耗时操作对于线程的占用时间较长那请求资源的人多了服务端就可能挂了

java中如何实现按队列执行任务

package com.tone.example;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import com.tone.task.TaskProperty;

import com.tone.task.TaskSignature;

import com.tone.task.impl.BasicTask;

import com.tone.task.runner.TaskRunner;

/**

* 任务队列示例程序

* @author zlf

*/

public class TaskExample {

private TaskRunner taskRunner;

/**

* 做任务队列的初始化工作

*/

@Before

public void init() {

// 获取任务运行器

taskRunner = TaskRunner.getInstance();

// 将任务运行器放入线程进行调度

Thread thread = new Thread(taskRunner);

thread.start();

}

/**

* 等待任务执行完成,并做最后的退出工作

*/

@After

public void exit() throws InterruptedException {

Thread.sleep(600);

System.exit(0);

}

/**

* 最简单的任务运行示例

*/

@Test

public void example1() {

// 添加任务到任务运行器

taskRunner.addTask(new BasicTask() {

@Override

public void run() {

System.out.println("This is running in task runner thread, and thread is " + Thread.currentThread());

}

});

}

/**

* 加入优先执行顺序的任务运行器

*/

@Test

public void example2() {

// 添加任务到任务运行器

taskRunner.addTask(new BasicTask(0) {

@Override

public void run() {

System.out.println("This is a normal task");

}

});

taskRunner.addTask(new BasicTask(-1) {

@Override

public void run() {

System.out.println("This is a task a bit high than normal");

}

});

}

/**

* 重复添加的任务只会运行第一个

*/

@Test

public void example3() {

// 添加任务到任务运行器

taskRunner.addTask(new BasicTask(TaskSignature.ONE) {

@Override

public void run() {

System.out.println("This is task one");

}

}, TaskProperty.NOT_REPEAT);

taskRunner.addTask(new BasicTask(TaskSignature.ONE) {

@Override

public void run() {

System.out.println("This is also task one");

}

}, TaskProperty.NOT_REPEAT);

}

/**

* 重复添加的任务只会运行最后一个

*/

@Test

public void example4() {

// 添加任务到任务运行器

taskRunner.addTask(new BasicTask(TaskSignature.ONE) {

@Override

public void run() {

System.out.println("This is task one");

}

}, TaskProperty.NOT_REPEAT_OVERRIDE);

taskRunner.addTask(new BasicTask(TaskSignature.ONE) {

@Override

public void run() {

System.out.println("This is also task one");

}

}, TaskProperty.NOT_REPEAT_OVERRIDE);

}

}

java中的队列用什么实现

队列的实现单纯的是数据结构的问题,既可以用链表结构实现队列,也可以用数组实现。这和语言不是紧密关系,java可以这样实现,C、C++ 也可以。

到底什么是消息队列?Java中如何实现消息队列

消息队列,顾名思义 首先是个队列。 队列的操作有入队和出队

也就是你有一个程序在产生内容然后入队(生产者) 另一个程序读取内容,内容出队(消费者)

这是最最基本的概念。

我想你应该是缺乏一个使用场景。

当你不需要立即获得结果,但是并发量又不能无限大的时候,差不多就是你需要使用消息队列的时候。

比如你写日志,因为可能一个客户端有多个操作去写,又有很多个客户端,显然并发不能无穷大,于是你就需要把写日志的请求放入到消息队列里,在消费者那边依次把队列中产生的日志写到数据库里。

至于怎么实现消息队列,其实你本身一个普通的队列就行呀~看你需要什么附加功能而已。

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