循环通过LinkedList

时间:2016-11-16 08:42:57

标签: java multithreading linked-list

我试图从我的缓冲类(LinkedList)中获取BufferCharacter,然后遍历LinkedListReader中的每个元素。但是当我尝试在LinkedList类中的get()方法中返回BufferCharacter时,我无法在Reader类中循环它。我已经尝试在Buffer类中遍历List,然后从那里返回每个元素,但这也不起作用。

非常感谢任何帮助!

 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) {
            }

        }
    }
}

2 个答案:

答案 0 :(得分:1)

我觉得你不明白你在说什么;所以我们试着在这里说清楚。

最后,你谈论的是某种包含多个元素的“集合”类;在你的情况下是LinkedList。问题是:为了使用这样的类,您需要清楚地了解您打算提供的API。

您认为您希望使用缓冲区存储使用putSync()添加的各个字符值。

但是...... getSync()到底应该做什么?

在您的情况下,您只是返回缓冲区,这可能是错误

相反,您希望使用以下方法:

synchronized boolean hasNext() 

synchronized char getNext() 

你班级的用户可以调用第一种方法来表示:是否有其他字符;如果是这样,第二种方法返回这些值。

这将是改进代码的第一种简单方法。更合理的方法是实现一个方法getIterator(),它将返回一个实现Iterator接口的对象。

其他注意事项:如果您使用的是“内置”LinkedList;请理解这个课程支持泛型!

因此你应该像以下一样使用它:

private final List<Character> buffer = new LinkedList<>();

从使用强类型集合中获得所有好处!

编辑:根据您的意见,我认为使用 LinkedList 只是错误的做法。

您想使用Queue,而不是使用列表,例如:

private final Queue<Character> buffer = new ConcurrentLinkedQueue<>();

该课程为您提供一方可以在队列尾部添加元素的功能;而另一方从队列头中删除元素。

额外奖励:该课程已经为您完成同步工作,因此您无需关心!

答案 1 :(得分:0)

使用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();