Мой обратный отсчет падает только на 1 и больше, почему это так? - PullRequest
0 голосов
/ 12 января 2020

Итак, я хочу создать обратный отсчет для введенной пользователем даты в классе обслуживания. Прямо сейчас у меня проблемы с обратным отсчетом. Кажется, неважно, что он вычитает только 1 секунду, а не go далее. это код:

лог c для обратного отсчета

package com.example.service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CounterService {
    LocalDateTime dateTime;

    public LocalDateTime getDateTime(){
        return dateTime;
    }

    public void setDateTime(LocalDateTime dateTime) {
        this.dateTime = dateTime;
    }

    public LocalDateTime parseDate(String eventDate) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        dateTime = LocalDateTime.parse(eventDate, formatter);
        return dateTime;
    }


    public static void main(String[] args) {

        CounterService cs = new CounterService();
        LocalDateTime a = LocalDateTime.of(2021,11,11,21,43,44);
        cs.setDateTime(a);

        Runnable r = new Counter(cs);
        new Thread(r).start();

    }
}

и Runnable

package com.example.service;

import java.time.LocalDateTime;

public class Counter implements Runnable {
    CounterService counter;

    public Counter(CounterService cs) {
        this.counter = cs;
    }

    public void setCounter(CounterService cs) {
        this.counter = cs;
    }

    public void run() {
        LocalDateTime countFromThisDate = counter.getDateTime();
        try {
            boolean x = true;
            while (x) {
                LocalDateTime substracting = countFromThisDate.minusSeconds(1);
                Thread.sleep(1000);
                System.out.println(substracting);
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

также, как я смогу добавить этот счетчик ( после того, как он работает), чтобы он обновлялся динамически и вычитал каждую секунду один за другим?

Ответы [ 2 ]

1 голос
/ 12 января 2020

Здесь указывается на недостаток реализации - Thread.sleep не гарантирует, что поток будет запущен после пройденного интервала, он просто делает состояние потока готовым (для запуска процессором) после интервала. Вместо этого вы должны использовать системное время, чтобы получить время, прошедшее с момента запуска счетчика.

- ОБНОВЛЕНИЕ -

Небольшое изменение в вашем CounterService сделает Работа. CounterService также будет сохранять время начала помимо даты и времени обратного отсчета. Код будет выглядеть примерно так:

class CounterService {      

    private LocalDateTime dateTime;

    private LocalDateTime startTime;

    public CounterService(LocalDateTime dateTime, LocalDateTime startTime) {
        this.dateTime = dateTime;
        this.startTime = startTime;
    }

    public LocalDateTime getCounterTime() {
        return dateTime.minusSeconds(startTime.until(LocalDateTime.now(), ChronoUnit.SECONDS));
    }

    public static void main (String[] args) throws java.lang.Exception {
        LocalDateTime a = LocalDateTime.of(2021,11,11,21,43,44);
        LocalDateTime startTime = LocalDateTime.now();

        final CounterService counterService = new CounterService(a, startTime);

        new Thread(() -> {
            while (true) {
                System.out.println(counterService.getCounterTime());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
0 голосов
/ 12 января 2020

LocalDateTime является неизменным.

countFromThisDate.minusSeconds(1) возвращает новый экземпляр, он не обновляет вызываемый экземпляр. Вам нужно будет присвоить результат где-нибудь (например, позвонив setDateTime на вашем сервисе).

Это работает так же, как и с String.

Этот сервис также необходимо сделать поточно-ориентированным (для этого вам, вероятно, следует переместить logi вычитания c в саму службу, чтобы он мог стать atomi c вместо get / subtract / set).

...