Добрый день. 2 варианта решения
- первый закомменчен, он кривой и не завершается, проверку не проходит по первому пункту.
- второй на моих тестовых данных работает корректно (завершается, данные равномерно распределяются по потокам, всё выводится) и в идее и на сайте, но при попытке отправить его на проверку падает с таймаутом.
Думала, что возможно программа уходит в бесконечный цикл и на всякий случай напихала доп. проверок на прерывание потока.
Вопрос что с ней не так?
package com.javarush.task.task16.task1628;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/*
Кто первый встал - того и тапки
*/
public class Solution {
public static volatile AtomicInteger readStringCount = new AtomicInteger(0);
public static volatile BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
//read count of strings
int count = Integer.parseInt(reader.readLine());
//init threads
ReaderThread consoleReader1 = new ReaderThread();
ReaderThread consoleReader2 = new ReaderThread();
ReaderThread consoleReader3 = new ReaderThread();
consoleReader1.start();
consoleReader2.start();
consoleReader3.start();
while (count > readStringCount.get()) {
}
//reader.close();
consoleReader1.interrupt();
consoleReader2.interrupt();
consoleReader3.interrupt();
System.out.println("#1:" + consoleReader1);
System.out.println("#2:" + consoleReader2);
System.out.println("#3:" + consoleReader3);
reader.close();
}
public static class ReaderThread extends Thread {
private List<String> result = new ArrayList<String>();
public void run() {
try
{
while (!isInterrupted()) {
// synchronized (reader) {
// String str = reader.readLine();
// if (isInterrupted()) return;
// result.add(str.toString());
// readStringCount.incrementAndGet();
// }
synchronized (reader) {
if (reader.ready()) {
StringBuilder resultS = new StringBuilder();
boolean flag = false;
while (flag == false) {
char ch = (char) reader.read();
if (isInterrupted()) return;
if (ch == '\n') flag = true;
else resultS.append(ch);
}
if (isInterrupted()) return;
result.add(resultS.toString());
readStringCount.incrementAndGet();
}
}
}
}
catch (Exception e) {
}
}
@Override
public String toString() {
return result.toString();
}
}
}