Изначально решить не получилось, в принципе понимал почему, так как reader один, а его хотят использовать несколько нитей, нашел здесь совет по оборачивание цикла чтения в проверку готовности ридера через его метод ready(); вот собственно есть пара вопросов: 1) почему выбрасывает Exception при использования reader.ready(), после того как вывод нужный на экран уже произошел 2) почему без использования reader.ready() вообще получается что-то записать и тем более в один и тот же List
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 consolReader1 = new ReaderThread();
        ReaderThread consolReader2 = new ReaderThread();
        ReaderThread consolReader3 = new ReaderThread();

        consolReader1.start();
        consolReader2.start();
        consolReader3.start();

        while (count > readStringCount.get()) {
        }

        consolReader1.interrupt();
        consolReader2.interrupt();
        consolReader3.interrupt();
        System.out.println("#1:" + consolReader1);
        System.out.println("#2:" + consolReader2);
        System.out.println("#3:" + consolReader3);
//        System.out.println(readStringCount);
        reader.close();
    }

    public static class ReaderThread extends Thread {
        private List<String> result = new ArrayList<String>();

        public void run() {
            //add your code here - добавьте код тут

                while (!isInterrupted()) {
                    try {
                        if (reader.ready()) {
                            result.add(reader.readLine());
                            readStringCount.incrementAndGet();
                        }
                    } catch (IOException exception) {
                        exception.printStackTrace();
                    }
                }
        }

        @Override
        public String toString() {
            return result.toString();
        }
    }
}