【问题标题】:Queue have only last message队列只有最后一条消息
【发布时间】:2018-04-30 02:21:40
【问题描述】:

我的申请有点问题。

我有 3 个线程:主线程、生产者 - 读取一些文件和消费者 - 逐行显示读取的文件;

这里是 mains 类的简短版本:

MAIN.class

 for (int i = 0; i < args.length; i++) {
        List<Thread> threadList = new ArrayList<Thread>();
        String file = args[i];
        int queueSize = 10;
        int waitTime = 200;
        BlockingQueue queue = new LinkedBlockingQueue(queueSize);



            Reader reader = (Reader) context.getBean("reader");
            Writer writer = (Writer) context.getBean("writer");


            Handler handler = (Handler) context.getBean("Handler", writer, reader, queueSize);
            Producer producer = (Producer) context.getBean("Producer", handler, queue, waitTime);
            Consumer consumer = (Consumer) context.getBean("Consumer", handler, queue, waitTime);

            handler.setFile(file, extension.get(0));
            threadList.add(new Thread(producer, "Producer"));
            threadList.add(new Thread(consumer, "Consumer"));

            for (Thread thread : threadList) {
                thread.start();
            }

            for (Thread thread : threadList) {
                try {
                    thread.join();
                } catch (InterruptedException e) {
                    System.err.println("Interrupted Exception thrown by : " + thread.getName());
                }
            }
        } else break;

}

HANDLER.class

public Handler(Writer writer, Reader reader, int count) {

    this.reader = reader;
    this.writer = writer;
    queue = new LinkedBlockingQueue(count);

}

public void getHandle(LinkedList list) {

    writer.Printer(list);

}


public LinkedList setHandle(String string, int line) {

    reader.objectReader(string, getFileName(), line);
    return reader.getList();

}

CONSUMER.class

    public Consumer(Handler handler, BlockingQueue queue, int waitTime) {
    this.queue = queue;
    this.handler = handler;
    this.waitTime = waitTime;
}


@Override
public void run() {

    while (!isEnd()) {

        try {

            handler.getHandle(queue.poll(waitTime, MILLISECONDS));

        } catch (Exception e) {
            System.err.println(e);

        }
    }

}


private boolean isEnd() {

    if (queue.isEmpty() && handler.isFileEnd()) {
        return true;
    } else {
        return false;
    }
}

PRODUCER.class

public Producer(Handler handler, BlockingQueue queue, int waitTime) {
    this.queue = queue;
    this.handler = handler;
    this.waitTime = waitTime;


}

@Override
public void run() {

    try {


        if (handler.getFileExtension().equals("xlsx")) {
            xlsxCheck(handler.getFile());

        } else {
            Stream stream = Files.lines(getFilePath());
            Iterator iterator = stream.iterator();
            String string = (String) iterator.next();

            while (string != null) {

         queue.offer(handler.setHandle(string , i), waitTime, MILLISECONDS);

                if (!iterator.hasNext()) {

                    setFileEnd(true);
                    System.out.println("produce stop");
                    Thread.sleep(100);
                    break;
                }
                string = (String) iterator.next();
                i++;
            }

        }
    } catch (Exception e) {
        System.out.println("Error: " + e);
    } 

}

我的第一个问题是 Producer 和 Main 类在 Consumer 处于 WAIT 状态时停止,但我使用 BlockingQueue 的 poll() 方法解决了它。 第二个是当我读取我在控制台中看到的文件时:

  1. 放入队列 [2, 200, order2, 1.csv, 2, OK] ---i--- 2
  2. 放入队列 [3, 200, order3, 1.csv, 3, OK] ---i--- 3
  3. 放入队列 [4, 200, order4, 1.csv, 4, OK] ---i--- 4
  4. 放入队列 [5, 200, order5, 1.csv, 5, OK] ---i--- 5
  5. 放入队列 [6, 200, order6, 1.csv, 6, OK] ---i--- 6
  6. 放入队列 [7, 200, order7, 1.csv, 7, OK] ---i--- 7
  7. 放入队列 [8, 200, order8, 1.csv, 8, OK] ---i--- 8

很好。

但之后,我明白了

  1. {}
  2. {"id":"8","amount":"200","comment":"order8","filename":"1.csv","line":8,"result":"OK "}
  3. {"id":"8","amount":"200","comment":"order8","filename":"1.csv","line":8,"result":"OK "}
  4. {"id":"8","amount":"200","comment":"order8","filename":"1.csv","line":8,"result":"OK "}
  5. {"id":"8","amount":"200","comment":"order8","filename":"1.csv","line":8,"result":"OK "}
  6. {"id":"8","amount":"200","comment":"order8","filename":"1.csv","line":8,"result":"OK "}
  7. {"id":"8","amount":"200","comment":"order8","filename":"1.csv","line":8,"result":"OK "}
  8. {"id":"8","amount":"200","comment":"order8","filename":"1.csv","line":8,"result":"OK "}

我只有最后一行 8 次是不正确的。我不明白为什么。

谁能帮我解决这个问题?

【问题讨论】:

    标签: java json spring queue


    【解决方案1】:

    这很奇怪,但它需要在 reader.objectReader() 中读取文件的每一步都创建新的 List;

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 2018-01-09
      • 2023-03-14
      相关资源
      最近更新 更多