Я разрабатываю какую-то программу, которая должна читать файлы журнала и я думал, что я построил умный механизм в нем, оказывается, код даже не компилировать ...Thread.sleep зовущего Thread.sleep
Я сделал большой недостаток дизайна: как это исправить?
public class Reader implements Runnable {
private volatile boolean isReading;
private final File file;
public Reader(final File file) {
this.file = file;
}
@Override
public void run() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
} catch (FileNotFoundException ex) {
throw new IllegalStateException("bf4logreader.Reader.run: File has not been found. file = " + file);
}
while (isReading) {
String line = null;
try {
line = reader.readLine();
} catch (IOException ex) {
throw new IllegalStateException("bf4logreader.Reader.run: Something went wrong when reading file. file = " + file);
}
if (line == null) {
//No new lines
long startSleepTime = System.currentTimeMillis();
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException ex) {
if (isReading) {
//Not supposed to be interrupted
Thread.sleep(System.currentTimeMillis() - startSleepTime);
}
else {
try {
//Needs to shutdown
reader.close();
} catch (IOException ex1) {
Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex1);
}
}
}
}
else {
//Process new lines
System.out.println("Line: " + line);
}
}
}
public void shutdown() {
isReading = false;
}
}
Я думал, что быть умным и пусть нить спать в течение времени, он все еще должен был спать, если она была прервана unappropiately. Однако я могу, конечно, не делать этого в этой фракции, так как это потребует обработки Thread.sleep
InterrruptedException
.
Я думаю, что это необходимо для преобразования в цикл while
, но как это сделать?
EDIT: Извините, что я забыл придать идею этой программе. Но я хочу следить за журнальным файлом, поэтому он никогда не перестанет читать этот файл, за исключением случаев, когда я укажу на это с сообщением об отключении.
попытаться выкинуть всю часть 'if (line == null)'. 'reader.readLine()' должен блокироваться, пока не будет чего-то читать. – zapl
@zapl не будет достигнут конец файла. –
Я бы предположил, что как только поток прерывается, он должен прекратить делать то, что он делает. –