gpt4 book ai didi

java - 如何记录秒数?

转载 作者:行者123 更新时间:2023-12-01 20:23:39 25 4
gpt4 key购买 nike

我正在构建一个 Java 应用程序,我需要跟踪程序启动后已经过去了多少秒。我试图用一个线程来实现这一点,所以我有一个主类来创建 timeController 线程,等待 5 秒然后停止它,出于测试目的,这是 timeController 现在应该做的是每 0.5 秒打印经过的秒数。但请记住,我的最终目标是让不同对象的多个线程以同步方式向 timeController 询问经过的秒数。目前它只打印第一个 Calendar.SECOND 并且从不更新该值,因为它在中断之前运行 5 秒并每半秒更新一次,我希望看到类似 44 44 45 45 46 的内容46 47 47 48 48(假设系统启动时秒数为 44)。谢谢。

public class Main {

public static void main(String[] args) {

TimeController timeCon = TimeController.getInstance();

timeCon.start();
try {
Thread.sleep(5000);
timeCon.stop();
} catch (Exception e){
//ignore for now
}
}
}

public class TimeController implements Runnable{

private static TimeController instance = null;
private volatile Thread timeCon;

private Calendar calendarInstance = Calendar.getInstance();
private int secondsElapsed = 0;
private int incialSeconds = 0;

public int getElapsedSeconds(){
return secondsElapsed;
}

public static TimeController getInstance(){
if(instance == null){
instance = new TimeController();
}
return instance;
}

public void start(){
timeCon = new Thread(this);
timeCon.start();
}

public void stop(){
timeCon = null;
}

@Override
public void run() {
Thread thisThread = Thread.currentThread();
while (thisThread == timeCon) {
try {
Thread.sleep(500);
secondsElapsed = calendarInstance.get(Calendar.SECOND) - incialSeconds;
System.out.println(getElapsedSeconds());
} catch (Exception e){
//Ignore for now.
}
}
}
}

最佳答案

For now it only prints the first Calendar.SECOND and never updates that value

您似乎想为计时问题提供并发解决方案,但计时线程中的代码都没有同步。至少这个 block 是可疑的:

private Calendar calendarInstance = Calendar.getInstance();
private int secondsElapsed = 0;
private int incialSeconds = 0;

public int getElapsedSeconds(){
return secondsElapsed;
}

此处没有进行同步。由于线程可能在具有不同本地高速缓存的不同内核上执行,因此无法保证对一个线程中的变量所做的更改对于在不同处理器内核上执行的另一个线程是可见的。这可能就是您的代码中发生的情况。

您需要仔细定义可变对象(此处为 TimerController)的状态空间,并实现对您的用例有意义的线程安全策略。您的策略的目标是保护对象的可变状态免受导致 active 和安全故障的竞争条件的影响(即防止无效的状态转换)。解决这个问题的常用方法是使用监视器模式,通过使用锁来实现互斥和可见性。

关于java - 如何记录秒数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44213007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com