import java.io.IOException;
/**
* Второй поток. Каждые 10 секунд проверяет размер файла
* {@link FileHelper#FILE_NAME}; если размер превышает 200 байт —
* сохраняет файл под уникальным именем и обнуляет исходный.
* <p>
* Проверка размера и операция сохранения выполняются внутри
* {@code synchronized (FileHelper.MONITOR)}, поэтому переименование
* не произойдёт во время записи первым потоком.
* </p>
*
* @author Student
* @version 1.0
*/
public class CheckerThread extends Thread {
/** Интервал проверки файла — 10 секунд. */
private static final long CHECK_INTERVAL_MS = 10_000L;
/** Пороговый размер файла — 200 байт. */
private static final long MAX_SIZE = 200L;
/** Флаг работы потока. */
private volatile boolean running = true;
/**
* Создаёт поток с именем {@code CheckerThread}.
*/
public CheckerThread() {
super("CheckerThread");
}
/**
* Требует остановки потока.
* Прерывает его даже во время сна через {@link Thread#interrupt()}.
*/
public void stopThread() {
running = false;
this.interrupt();
}
/**
* Основной цикл потока.
* Обрабатывает {@link IOException} при работе с файлами и
* {@link InterruptedException} при прерывании сна.
*/
@Override
public void run() {
while (running && !isInterrupted()) {
// Сон 10 секунд вне критической секции
try {
Thread.sleep(CHECK_INTERVAL_MS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
// Критическая секция — проверка размера и сохранение
synchronized (FileHelper.MONITOR) {
try {
if (FileHelper.fileSize() > MAX_SIZE) {
FileHelper.saveAndClear();
System.out.println("[" + FileHelper.currentTime()
+ "] Файл сохранён под уникальным именем и обнулён.");
}
} catch (IOException e) {
System.err.println("[Checker] Ошибка сохранения/очистки: "
+ e.getMessage());
}
} // конец synchronized
}
}
}