Java 长跑
我正在为班级做一个项目,我们将从书中学习到的代码组合成一个循环队列(在本项目中称为环形缓冲区),经过几个小时的阅读/修复错误并组合在一起,我最终得出以下结论:Java 长跑,java,performance,runtime,Java,Performance,Runtime,我正在为班级做一个项目,我们将从书中学习到的代码组合成一个循环队列(在本项目中称为环形缓冲区),经过几个小时的阅读/修复错误并组合在一起,我最终得出以下结论: import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Scanner; import java.io.BufferedInputStream; import java.io.PrintWriter; import java.
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.io.BufferedInputStream;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
public class RingBuffer<Item> implements Iterable<Item>
{
private int maxSize,size,first,last;
private Item[] buffer;
public RingBuffer(int maxSize)
{
this.maxSize=maxSize;
buffer=(Item[])new Object[maxSize];
}
public boolean isEmpty(){return size==0;}
public boolean isFull(){return size==maxSize;}
public void enqueue(Item item)
{
if(isFull())
throw new RuntimeException("The buffer is full");
buffer[last]=item;
last++;
if(last==maxSize)
last=0;
size++;
}
public Item dequeue()
{
if(isEmpty())
throw new RuntimeException("The buffer is empty");
Item item=buffer[first];
first++;
if(first==maxSize)
first=0;
size--;
return item;
}
public Iterator<Item> iterator()
{
return new RingBufferIterator();
}
public class RingBufferIterator implements Iterator<Item>
{
private int current;
private boolean iterated;
public RingBufferIterator()
{
current=first;
}
public boolean hasNext()
{
if(iterated)
return current!=last;
return true;
}
public Item next()
{
if(!hasNext())
throw new NoSuchElementException();
Item result=buffer[current];
current++;
if(current==maxSize)
current=0;
iterated=true;
return result;
}
public void remove()
{
throw new UnsupportedOperationException();
}
}
public static void main(String[] args)
{
Scanner input=new Scanner(new BufferedInputStream(System.in));
PrintWriter output=new PrintWriter(new OutputStreamWriter(System.out),true);
RingBuffer<String> ring=new RingBuffer<String>(5);
while(input.hasNext())
{
String item=input.next();
if(!item.equals("-"))
ring.enqueue(item);
else if(!ring.isEmpty())
output.print(ring.dequeue()+" ");
}
output.println();
for(String st:ring)
output.print(st+" ");
output.println();
}
}
import java.util.Iterator;
导入java.util.NoSuchElementException;
导入java.util.Scanner;
导入java.io.BufferedInputStream;
导入java.io.PrintWriter;
导入java.io.OutputStreamWriter;
公共类RingBuffer实现了Iterable
{
private int maxSize,size,first,last;
私有项[]缓冲区;
公共环形缓冲区(int-maxSize)
{
这个.maxSize=maxSize;
缓冲区=(项[])新对象[maxSize];
}
公共布尔值isEmpty(){return size==0;}
公共布尔值isFull(){return size==maxSize;}
公共作废排队(项目)
{
如果(isFull())
抛出新的RuntimeException(“缓冲区已满”);
缓冲区[最后]=项目;
last++;
if(last==maxSize)
last=0;
大小++;
}
公共项目出列()
{
if(isEmpty())
抛出新的RuntimeException(“缓冲区为空”);
项目=缓冲区[第一];
第一++;
如果(第一个==maxSize)
第一个=0;
大小--;
退货项目;
}
公共迭代器迭代器()
{
返回新的RingBufferIterator();
}
公共类RingBufferIterator实现了迭代器
{
私有电流;
私有布尔迭代;
公共环缓冲迭代器()
{
电流=第一;
}
公共布尔hasNext()
{
如果(迭代)
返回电流!=最后一次;
返回true;
}
公共项目下一步()
{
如果(!hasNext())
抛出新的NoTouchElementException();
项目结果=缓冲区[当前];
电流++;
如果(当前==maxSize)
电流=0;
迭代=真;
返回结果;
}
公共空间删除()
{
抛出新的UnsupportedOperationException();
}
}
公共静态void main(字符串[]args)
{
扫描仪输入=新扫描仪(新的BufferedInputStream(System.in));
PrintWriter输出=新的PrintWriter(新的OutputStreamWriter(System.out)),true;
环形缓冲区环=新的环形缓冲区(5);
while(input.hasNext())
{
String item=input.next();
如果(!item.equals(“-”)
排队(项目);
如果(!ring.isEmpty())
output.print(ring.dequeue()+“”);
}
output.println();
用于(字符串st:环)
输出。打印(st+“”);
output.println();
}
}
没有错误,但我们得到了为分配运行的参数,我在netbeans的运行设置中添加了这些参数。大约半小时前我按了run,但它仍在运行。作为一名cs学生,我从来没有遇到过这个问题,我想知道是什么导致了这个问题。是否有什么需要改变的编码或一些代码可以花这么长的时间运行,我应该等待它了?提前感谢在调试器的帮助下,您应该可以很容易地发现错误。。。写下一段代码并使其在第一次尝试时顺利运行且无错误几乎是不可能的:-)您好,谢谢您的快速响应。我在netbeans和eclipse上都运行了这个程序,它没有出现任何错误(它以前出现过,我修复了它们)。既然你说有一个简单的bug问题,它会一直困扰着我,直到我找到它,我想你的问题被称为“无限循环”。它也可能是“无限阻塞”。这两者都可以通过分析工具(如VisualVM(随netbeans提供)轻松发现。如果您在netbeans或Eclipse中使用调试器,它将准确地告诉您问题所在。您还可以使用类似JVisualVM的东西来监视应用程序。或者,在最坏的情况下,您可以使用
kill-3
获得线程转储。没有错误,因为代码是完全有效的-有很多原因你可能真的想要一个无限循环。@MarkoTopolnik@boristesspider谢谢你的建议,我甚至没有想过要这么做。我现在正在运行调试器,它也需要时间(调试器也需要一点时间是正常的吗?)