java 自行编写程序实现队列的效果

java 自行编写程序实现队列的效果,第1张

class myqueue

{

ArrayList<Integer>

list = new ArrayList<Integer>();

public boolean add(Integer value)

{

return listadd(value);

}

public boolean offer(Integer value)

{

return listadd(value);

}

/

function: 获取但不移除对象的头 为空时抛出异常

@return

/

public Integer element()

{

if(listsize() == 0) throw new NoSuchElementException();

return listget(0);

}

/

function: 获取但不移除对象的头 为空时 返回null

@return

/

public Integer peek()

{

if(listsize() == 0) return null;

return listget(0);

}

/

function: 获取并移除对象的头 为空时未null

@return

/

public Integer poll()

{

if(listsize() == 0) return null;

Integer i = listget(0);

listremove(0);

return i;

}

/

function:获取并移除对象的头 为空时抛出异常

@return

/

public Integer remove()

{

if(listsize() == 0) throw new NoSuchElementException();

Integer i = listget(0);

listremove(0);

return i;

}

}

真正需要的其实很简单,就是个BlcokingQueue

你可以在主线程里,向BlockingQueue添加对象,这个过程是即时返回的,不会阻塞。然后另外启动一个线程专门读取BlockingQueue的对象,进行处理,一旦队列里没有新对象,这个线程会自动阻塞到有新的对象加入到队列为止。

public class HelloWorld{

public static void main(String[] args){

Systemoutprintln("hello world!");

}

}

一 基本概念

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

二 体系

Java分为三个体系,分别为Java SE(J2SE,Java2 Platform Standard Edition,标准版),

JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企业版)。

Java ME(J2ME,Java 2 Platform Micro Edition,微型版)。

java中的消息队列

消息队列是线程间通讯的手段:

importjavautil

publicclassMsgQueue{

privateVectorqueue=null;

publicMsgQueue(){

queue=newVector();

}

publicvoidsend(Objecto)

{

queueaddElement(o);

}

publicObjectrecv()

{

if(queuesize()==0)

returnnull;

Objecto=queue();

queue(0);//orqueue[0]=nullcanalsowork

returno;

}

}

因为java中是lockedbyobject的所以添加就可以用于线程同步锁定对象

可以作为多线程处理多任务的存放task的队列。他的client包括封装好的task类以及thread类

Java的多线程-线程间的通信2009-08-2521:58

1线程的几种状态

线程有四种状态,任何一个线程肯定处于这四种状态中的一种:

1)产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。

2)可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。

3)死亡(Dead):当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。

4)停滞(Blocked):当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。

2classThread下的常用函数函数

21suspend()、resume()

1)通过suspend()函数,可使线程进入停滞状态。通过suspend()使线程进入停滞状态后,除非收到resume()消息,否则该线程不会变回可执行状态。

2)当调用suspend()函数后,线程不会释放它的“锁标志”。

例11:

classextendsThread{

publicstaticintshareVar=0;

public(Stringname){

super(name);

}

publicvoidrun(){

if(shareVar==0){

for(inti=0;i

shareVar;

if(shareVar==5){

thissuspend();//(1)

}}}

else{

Systemoutprint(Thread()getName());

Systemoutprintln("shareVar="shareVar);

thisresume();//(2)

}}

}

publicclassTestThread{

publicstaticvoidmain(String[]args){

t1=new("t1");

t2=new("t2");

t1start();//(5)

//t1start();//(3)

t2start();//(4)

}}

参考代码和注释如下

简单测试了下,如果有问题接着在讨论

public class Queue {

private int[] elements;

public static final int DEFAULT_CAPACITY =8;//默认长度8

private int size = 0;

public Queue() {

elements = new int[DEFAULT_CAPACITY];

}

public Queue(int capacity) {

elements = new int[capacity];

}

public void enqueue(int v) {

if (size >= elementslength) {// 数组扩容

int[] temp = new int[elementslength  2];

Systemarraycopy(elements, 0, temp, 0, elementslength);

elements = temp;

}

elements[size++] = v;

}

public int dequeue() {// 先进先出

if (empty()) {

throw new RuntimeException("异常");

}

int x = elements[0];// 先把第一个元素保存出来

// 左移一位

// int[] temp = new int[elementslength];

// Systemarraycopy(elements,1, temp, 0, elementslength-1);

// elements = temp;

// 左移一位

for (int i = 0; i < elementslength - 1; i++) {

elements[i] = elements[i + 1];

}

elements[elementslength - 1] = 0;// 外面一般访问不了elements 后面的元素可以不用归零,但是归零了感觉舒服点

size--;

return x;

}

public boolean empty() {

return size == 0;

}

public int getSize() {

return size;

}

}

输出

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

import javautilArrayList;

/

@author 狱韬

/

public class SnakeBody {

private int size=0; //队列的长度

private int cursor=-1; //指针

private ArrayList<int[]> list=null; //存储器

public SnakeBody() {

list=new ArrayList<int[]>(); //存储器

}

//返回底部的数据

public int[] getLast(){

return listget(listsize()-1);

}

//返回顶部的数据

public int[] getFirst(){

return listget(0);

}

//压入数据

public void put(int[] arry){

listadd(arry);

}

//删除底部数据

public void removeLast(){

listremove(listsize()-1);

}

//重置

public void reSet(){

list=new ArrayList<int[]>(); //存储器

}

//删除顶部数据

public void removeFirst(){

listremove(0);

}

//返回数据长度

public int size(){

return listsize();

}

public static void main(String[] args) {

SnakeBody data = new SnakeBody();

for(int i=0;i<10;i++){

dataput(new int[]{0,i});

}

Systemoutprintln(datagetFirst()[0]+"-------"+datagetFirst()[1]);

Systemoutprintln(datagetLast()[0]+"-------"+datagetLast()[1]);

dataremoveLast();

Systemoutprintln(datagetFirst()[0]+"-------"+datagetFirst()[1]);

Systemoutprintln(datagetLast()[0]+"-------"+datagetLast()[1]);

}

}

import javautilStack;

public class Translate {

//程序入口

public static void main(String[]args){

int n = Translatetranslate(3467,8);

Systemoutprintln("结果是:"+n);

}

public static int translate(int number, int base_num) {

//使用栈

Stack<Integer>stack = new Stack<Integer>();

while(number>0){

//压栈

stackpush(number % base_num);

number /= base_num;

}

int n = stacksize();

int val=0;

//依次出栈并合成结果(用我们熟悉的十进制表示,所以乘以10)

for(int i=0;i<n;i++){

val=val10+stackpop();

}

return val;

}

}

以上就是关于java 自行编写程序实现队列的效果全部的内容,包括:java 自行编写程序实现队列的效果、请教一个关于JAVA任务队列的实现、我需要一段最简单的java代码程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10142272.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存