Загрузка данных


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
        }
    }
}