@fife

Как создать бесконечный поток Java, не нагружая процессор на 100%?

Добрый день написал бота, в нем использовал создание трех потоков, которые работают в бесконечных
while(true){
}

но дело в том, что таким образом бот грузит процессор на 100%

Закину сюда один из потоков, для примера.
Данный поток при изменении в файле лога, вытаскивает из него последнюю строку. В самой программе, каждая новая строка должна быть обработана.
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.file.Paths;


public class LogReader implements Runnable{
    private static String lastLogString = "defaultLast";
    private static String sameMsgInLog = "defaultSame";
    private static long prevLenght = 1;
    private static File logFile = new File(String.valueOf(Paths.get("C:\\logs.txt")));
    @Override
    public void run() {
        while (true){
            if(logChanged()) {
                System.out.println("лог изменен");
                lastLogString = LogReader.readLog(logFile);
            }
        }
    }

    public static String readLog(File logFile){
        String strToReturn = "default";
        try {
            RandomAccessFile randomAccessFile = new RandomAccessFile(logFile, "r");
            StringBuilder builder = new StringBuilder();
            long length = logFile.length();
            prevLenght = length;
            length--;
            length--;//структура лог файла такова, что после добавления новой строки, за ней следует пустая строка, а эти строки кода переносят указатели на нужную строку
            randomAccessFile.seek(length);
            for (long seek = length; seek >= 0; --seek) {
                randomAccessFile.seek(seek);
                char c = (char) randomAccessFile.read();
                builder.append(c);
                if(c == '\n'){
                    builder = builder.reverse();
                    strToReturn = builder.toString();
                    break;
                }
            }
        } catch (Exception e) {
            System.out.println("Ошибка при чтении файла");
        }
        return strToReturn;
    }

    public static String getLastLogString() {
        if(lastLogString.equals(sameMsgInLog)){
            return "pass";
        }
        sameMsgInLog = lastLogString;
        return lastLogString;
    }

    public static boolean logChanged(){
        if(prevLenght != logFile.length()){
            return true;
        }else{
            return false;
        }
    }
}


метод getLastLogString вызываю из другого потока, для получения последний строки с лога и ее обработки.

Собственно вопрос, какие есть другие варианты решения моей задачи, которые значительно убавят нагрузку?
Код конечно писать за меня не прошу, но за какие то вставки / куда гуглить, буду благодарен!
  • Вопрос задан
  • 210 просмотров
Пригласить эксперта
Ответы на вопрос 1
@vabka
Токсичный
Вам вместо того чтобы запрашивать информацию о файле в бесконечном цикле, нужно подписаться на изменение файла.
Тогда ОС сама вас уведомит, что файл изменился.
https://docs.oracle.com/javase/7/docs/api/java/nio...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы