我的倒计时只减少了 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();
}
}
所以,我想为用户在服务中输入的日期创建一个倒计时 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();
}
}