У меня небольшая проблема с приложением.
У меня есть 3 темы: Main, Producer - прочитать какой-нибудь файл и Consumer - показать построчно прочитанный файл;
Краткая версия основных классов здесь:
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, но я решил это с помощью метода poll () BlockingQueue.
И второе, когда я читаю файл, я вижу в моей консоли следующие строки:
- Поставить в очередь [2, 200, order2, 1.csv, 2, OK] --- i --- 2
- Поставить в очередь [3, 200, order3, 1.csv, 3, OK] --- i --- 3
- Поставить в очередь [4, 200, order4, 1.csv, 4, OK] --- i --- 4
- Поставить в очередь [5, 200, order5, 1.csv, 5, OK] --- i --- 5
- Поставить в очередь [6, 200, order6, 1.csv, 6, OK] --- i --- 6
- Поставить в очередь [7, 200, order7, 1.csv, 7, OK] --- i --- 7
- Поставить в очередь [8, 200, order8, 1.csv, 8, OK] --- i --- 8
Это хорошо.
Но после, я вижу
- {}
- { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
- { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
- { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
- { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
- { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
- { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
- { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
Неправильно, что у меня 8 раз только последняя строка. И я не могу понять, почему.
Кто-нибудь может мне помочь с этим?