Метод Java wait() не ждет ⇐ JAVA
-
Anonymous
Метод Java wait() не ждет
Я пытаюсь создать программу, в которой есть основной поток, ожидающий, пока DataFactory создаст данные, и поток, создающий данные раз в минуту.
public static void main(String[] args) выдает исключение { окончательный DataFactory df = новый DataFactory("BTCUSDT"); дф.старт(); в то время как (истина) { синхронизированный (df) { System.out.println("Первое ожидание()"); дф.ожидание(); } System.out.println(df.getPrevMinData()); System.out.println(df.getActualData()); } } Это код main. Переменная df — это DataFactory, где я вызываю notify() при создании данных. Проблема в том, что первая итерация цикла while печатает два нуля, похоже, что на первой итерации метод wait() не выполняется, но со второй итерации он работает правильно.
публичный класс DataFactory расширяет поток { частный таймер таймер; частная строка prevMinData; частная строка фактических данных; частный конечный строковый символ; частный окончательный DataFactory thisDataFactory = это; public DataFactory (строковый символ) { таймер = новый таймер(); this.symbol = символ; } общественный недействительный запуск () { timer.scheduleAtFixedRate(новый TimerTask() { @Override общественный недействительный запуск () { получитьПредыдущиеМинутныеДанные(); получитьАктуальныеМинутныеДанные(); синхронизировано (thisDataFactory) { System.out.println("Приложение первого уведомления"); thisDataFactory.notify(); } } }, CalculateDelay(), 60000); } публичная строка getPrevMinData() { вернуть prevMinData; } публичная строка getActualData() { вернуть фактические данные; } частный длинный CalculateDelay () { долго сейчас = System.currentTimeMillis(); return ((long)Math.ceil(now/60000) * 60000 + 60000) — сейчас; } частная пустота getPreviousMinuteData () { /*Получить данные с помощью некоторого API*/ prevMinData = "Данные из API"; } частная пустота getActualMinuteData () { /*Получить данные с помощью некоторого API*/ factData = "Данные из API"; } частный статический long previousMinuteTimeStamp() { двойное время = System.currentTimeMillis(); return (long)Math.ceil(time / 60000) * 60000 - 60000; } } Это код DataFactory. Обратите внимание, что переменная thisDataFactory является ссылкой на экземпляр DataFactory, полученный с помощью thisDataFactory = this в объявлении класса.
Я пытаюсь создать программу, в которой есть основной поток, ожидающий, пока DataFactory создаст данные, и поток, создающий данные раз в минуту.
public static void main(String[] args) выдает исключение { окончательный DataFactory df = новый DataFactory("BTCUSDT"); дф.старт(); в то время как (истина) { синхронизированный (df) { System.out.println("Первое ожидание()"); дф.ожидание(); } System.out.println(df.getPrevMinData()); System.out.println(df.getActualData()); } } Это код main. Переменная df — это DataFactory, где я вызываю notify() при создании данных. Проблема в том, что первая итерация цикла while печатает два нуля, похоже, что на первой итерации метод wait() не выполняется, но со второй итерации он работает правильно.
публичный класс DataFactory расширяет поток { частный таймер таймер; частная строка prevMinData; частная строка фактических данных; частный конечный строковый символ; частный окончательный DataFactory thisDataFactory = это; public DataFactory (строковый символ) { таймер = новый таймер(); this.symbol = символ; } общественный недействительный запуск () { timer.scheduleAtFixedRate(новый TimerTask() { @Override общественный недействительный запуск () { получитьПредыдущиеМинутныеДанные(); получитьАктуальныеМинутныеДанные(); синхронизировано (thisDataFactory) { System.out.println("Приложение первого уведомления"); thisDataFactory.notify(); } } }, CalculateDelay(), 60000); } публичная строка getPrevMinData() { вернуть prevMinData; } публичная строка getActualData() { вернуть фактические данные; } частный длинный CalculateDelay () { долго сейчас = System.currentTimeMillis(); return ((long)Math.ceil(now/60000) * 60000 + 60000) — сейчас; } частная пустота getPreviousMinuteData () { /*Получить данные с помощью некоторого API*/ prevMinData = "Данные из API"; } частная пустота getActualMinuteData () { /*Получить данные с помощью некоторого API*/ factData = "Данные из API"; } частный статический long previousMinuteTimeStamp() { двойное время = System.currentTimeMillis(); return (long)Math.ceil(time / 60000) * 60000 - 60000; } } Это код DataFactory. Обратите внимание, что переменная thisDataFactory является ссылкой на экземпляр DataFactory, полученный с помощью thisDataFactory = this в объявлении класса.
Мобильная версия