我的倒计时只减少了 1,没有更多,这是为什么?

My countdown only drops by 1 and no more, why is that?

所以,我想为用户在服务中输入的日期创建一个倒计时 class.Right 现在我遇到了问题 countdown.It 似乎不管它只减去 1 秒而不是去 further.Here 是代码:

倒计时的逻辑

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();
        }
    }
}

还有我如何能够添加这个计数器(在它工作之后)以便它动态刷新并逐秒减去?

LocalDateTime 是不可变的。

countFromThisDate.minusSeconds(1) returns一个新的实例,它不会更新它被调用的实例。您需要将结果分配回某个地方(例如,通过在您的服务上调用 setDateTime)。

这与 String 的工作方式相同。

该服务还需要成为线程安全的(为此,您可能应该将减法逻辑移至服务本身,以便它可以成为原子而不是 get/subtract/set)。

在这里说明一个实现缺陷 - Thread.sleep 不能保证线程在经过的时间间隔后 运行,它只是使线程状态 就绪(运行 by cpu)在间隔之后。相反,您应该使用系统时间来获取自计数器启动以来经过的时间。

-- 更新--

您的 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();
    }
}