我试图从我的缓冲类(BufferCharacter
)中获得LinkedList
,然后循环Reader
类中LinkedList
中的每个元素。但是,当我尝试在BufferCharacter
类的get()
方法中返回LinkedList
时,我就不能在Reader
类中循环它。我试图在Buffer
类中循环列表,然后从那里返回每个元素,但这也不起作用。
任何帮助都非常感谢!
public class CharacterBuffer {
private char ch;
private LinkedList buffer = new LinkedList();
private boolean filled;
public void put(char ch) {
buffer.addLast(ch);
}
public void filled() {
filled = true;
}
public Object get() throws InterruptedException {
while (buffer.isEmpty()) {
// wait();
return "Waiting";
}
return buffer;
}
public synchronized void putSync(char ch) {
buffer.addLast(ch);
}
public synchronized Object getSync() throws InterruptedException {
while (buffer.isEmpty()) {
// wait();
return "---------";
}
for(int i = 0; i<buffer.size(); i++){
System.out.println(buffer.get(i));
}
return buffer;
}
public int size(){
return buffer.size();
}
}
public class Reader extends Thread {
private GUIMutex gui;
private CharacterBuffer buffer;
private boolean isSynced;
public Reader(GUIMutex gui, CharacterBuffer buffer, boolean isSynced) {
this.gui = gui;
this.buffer = buffer;
this.isSynced = isSynced;
}
public void run() {
String data = "test";
while (true) {
try {
// data = buffer.get();
if (isSynced) {
gui.setReaderText(buffer.getSync() + "n");
} else {
for(int i = 0; i<buffer.get().size(); i++){
gui.setReaderText(i);
}
gui.setReaderText(buffer.get() + "n");
}
Thread.sleep(700);
} catch (InterruptedException e) {
}
}
}
}
我想你不明白你在说什么;因此,让我们试着在这里阐明一些。
最后,你谈论的是某种包含多个元素的"集合"类;在你的例子中是LinkedList。问题是:为了使用这样的类,您需要清楚地了解您打算提供的api。
您认为您想使用缓冲区来存储使用putSync()
添加的单个字符值。
但是……getSync()
到底应该做什么?
在您的例子中,您只是返回缓冲区,这可能是错误的
相反,你希望有这样的方法:
synchronized boolean hasNext()
和
synchronized char getNext()
类的用户可以调用第一个方法来计算:是否有其他字符;如果是,第二个方法返回这些值。
这是改进代码的第一个简单方法。更合理的方法是实现一个方法getIterator()
,它将返回一个实现Iterator接口的对象。
其他需要注意的事情:如果你使用的是"内置"LinkedList;请理解这个类支持泛型!
因此你应该这样使用它:
private final List<Character> buffer = new LinkedList<>();
获得使用强类型集合的所有好处!
编辑:根据你的评论,我认为在这里使用LinkedList是完全错误的方法。不要使用List,而要使用Queue,如:
private final Queue<Character> buffer = new ConcurrentLinkedQueue<>();
这个类提供了这样的功能:一方可以在队列尾部添加元素;而另一方从队列头部删除元素。
额外的奖励:这个类已经在为你做同步工作了,所以你不需要关心它!
使用StringBuilder代替
StringBuilder sb = new StringBuilder(128);
// add chars using sb.append(char)
for (int i = 0, n = sb.length(); i < n; i++)
{
char c = sb.charAt(i);
}
or
String s = sb.toString();