Вы можете зарегистрировать все потоки как обратные вызовы в классе чтения файлов. У SO есть что-то вроде массива или списка классов, реализующих интерфейс StringReaderThread, который имеет метод processString (String input). После прочтения каждой строки из файла выполните итерацию по этому массиву / списку и вызовите processString () для всех потоков таким образом. Решит ли это вашу проблему?

я есть файл 250 МБ для чтения. И приложение является многопоточным. Если я разрешаю всем потокам читать файл, происходит голодание памяти. Я выхожу из памяти ошибки.

Чтобы этого избежать. Я хочу, чтобы в памяти была только одна копия строки (которая читается из потока), и я хочу, чтобы все потоки ее использовали.

while (true) {
    synchronized (buffer) {
        num = is.read(buffer);
            String str = new String(buffer, 0, num);

    }
    sendToPC(str);
}

По сути, я хочу иметь только одну копию строки, когда все потоки завершили отправку, я хочу прочитать вторую строку и так далее.