import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
Последовательный вывод файлов
*/
public class Solution {
public static String firstFileName;
public static String secondFileName;
static {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
firstFileName = reader.readLine();
secondFileName = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
systemOutPrintln(firstFileName);
systemOutPrintln(secondFileName);
}
public static void systemOutPrintln(String fileName) throws InterruptedException {
ReadFileInterface f = new ReadFileThread();
f.setFileName(fileName);
f.start();
f.join();
System.out.println(f.getFileContent());
}
public interface ReadFileInterface {
void setFileName(String fullFileName);
String getFileContent();
void join() throws InterruptedException;
void start();
}
public static class ReadFileThread extends Thread implements ReadFileInterface {
String fileName1;
String result = "";
public void setFileName(String fullFileName) {
fileName1 = fullFileName;
}
public String getFileContent() {
return result;
}
@Override
public void run() {
try {
BufferedReader reader2 = new BufferedReader(new FileReader(fileName1));
while (reader2.ready()) {
result += " ";
result += reader2.readLine();
}
reader2.close();
} catch (Exception e) {
}
}
}
}
Sasha
46 уровень
Решил, но не понял, как join() тут обеспечил последовательный вывод. Разжуйте, пожалуйста
Обсуждается
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
НикитаExpert
11 июля 2021, 17:50полезный
метод join() обеспечивает выполнение нить до конца, то есть запускаете одновременно две нити к примеру, в первой стоит этот метод. программа, доходит до него и приостанавливает все остальные нити до тех пор пока не выполнится эта.
в конкретном случае, смотрите как получается мы создаем нить ReadFileInterface f = new ReadFileThread();
потому вызываем метод f.setFileName(fileName); и передаем имя файла,
f.start(); запускаем нить. а дальше если нету метода join()
System.out.println(f.getFileContent()); выводим результат этого метода, но мы его еще не получили так как не дождались окончания работы нити, поэтому мы ставим метод join() программу дожидается пока она завершится и мы получаем результат этого метода)
конечно коряво, но как мог объяснил) +1
Sasha Middle Java Developer в EPAM
11 июля 2021, 19:35
Круто, спасибо. Я думал, что просто не начинала выполнение 2-я нить, а ждали 1-ю. Выходит, что метод бы просто вывел неполный результат?
0
НикитаExpert
11 июля 2021, 19:57
честно говоря, не понял что вы имеете ввиду)
0
Sasha Middle Java Developer в EPAM
11 июля 2021, 20:05
Что будет, если убрать джоин?
0
НикитаExpert
11 июля 2021, 20:44
не успеет выполнить метод run и строчка result будет пустой
0