画夕颜 2024-01-11 19:00 采纳率: 70%
浏览 14
已结题

Java做毫秒级计时器资源占用太高怎么办?

请教一个问题,我想用Java做一个精确到1毫秒的秒表计时器,目前用的核心代码是这样的:

    Timer timer = new Timer();
        
        timer.scheduleAtFixedRate(new TimerTask() {

            public void run() {

                if(Mode == 0) { // 秒表模式
                    
                    MsCount++;
                    
                } else { // 倒计时模式
                    
                    MsCount--;
                }

                // 根据毫秒数计算:时、分、秒、毫秒
                H = MsCount / (1000 * 60 * 60);
                        M = MsCount % (1000 * 60 * 60) / (1000 * 60);
                        S = MsCount % (1000 * 60) / 1000;
                Ms = MsCount % 1000;

                // 格式化输出内容:时、分、秒显示2位,毫秒显示3位
                Hh = String.format("%02d", H);
                Mm = String.format("%02d", M);
                Ss = String.format("%02d", S);
                Mss = String.format("%03d", Ms);

                SwingUtilities.invokeLater(() -> { // 事件调度线程,执行和UI相关的任务

                    TimeUI.setText(Hh + ":" + Mm + ":" + Ss + "." + Mss);
                });
                
                if(H == 24 || MsCount == 0) { // 秒表模式到达24小时或者倒计时为0时停止计时器
                    
                    timer.cancel();
                    timer.purge(); // 释放内存
                    
                    Btn1.setText("开始");
                    Btn2.setEnabled(true);
                    SetMode.setEnabled(true);
                    
                    if(MsCount == 0) {
                        
                        JOptionPane.showMessageDialog(Jf, "当前倒计时模式已结束!", "提示", JOptionPane.WARNING_MESSAGE);
                        
                    } else {
                        
                        JOptionPane.showMessageDialog(Jf, "当前秒表模式已达最大值:24:00:00.000 !", "提示", JOptionPane.WARNING_MESSAGE);
                    }
                }
            }

        }, 0, 1); // 计时器首次立即执行,后续任务间隔 1 毫秒执行一次

但是以上代码在执行的过程中会占用大量的CPU(50%以上)和内存(200MB以上)资源,考虑到精度1毫秒执行一次对系统的压力太大,尝试将Timer间隔设置为10毫秒,内存占用不变,且依旧占用15%以上的CPU资源!请问,有什么好的办法能在保持精度的前提下降低CPU和内存的资源占用吗?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-11 20:29
    关注

    【以下回答由 GPT 生成】

    对于使用更轻量级的计时器实现秒表功能,可以考虑以下步骤:

    1. 创建一个类来表示秒表,并定义一个startTimeelapsedTime变量来保存开始计时的时间和流逝的时间。
    2. 使用System.currentTimeMillis()来获取当前时间的毫秒级别的时间戳。
    3. 创建一个线程来更新显示的时间,该线程将不断更新elapsedTime变量的值。
    4. 在该线程中,使用一个循环结构来不断计算当前流逝的时间,并将结果保存到elapsedTime变量中。
    5. 在需要显示秒表时间的地方,可以根据elapsedTime变量的值将其格式化为想要的时间显示格式,并进行展示。

    下面是一个Java代码示例:

    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Stopwatch {
        private long startTime;
        private long elapsedTime;
        private boolean isRunning;
    
        public void start() {
            if (!isRunning) {
                startTime = System.currentTimeMillis();
                isRunning = true;
            }
        }
    
        public void stop() {
            if (isRunning) {
                elapsedTime += System.currentTimeMillis() - startTime;
                isRunning = false;
            }
        }
    
        public void reset() {
            elapsedTime = 0;
            isRunning = false;
        }
    
        public String getElapsedTime() {
            long elapsed = elapsedTime;
            if (isRunning) {
                elapsed += System.currentTimeMillis() - startTime;
            }
            SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
            return dateFormat.format(new Date(elapsed));
        }
    
        // Example usage
        public static void main(String[] args) {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.start();
    
            // Do some tasks...
    
            stopwatch.stop();
            System.out.println("Elapsed Time: " + stopwatch.getElapsedTime());
        }
    }
    

    这个示例代码使用了一个isRunning变量来判断秒表是否在运行中,以便在开始和结束计时时进行相应的操作。getElapsedTime()方法将流逝的时间格式化为"HH:mm:ss.SSS"的时间格式,并返回给调用者。

    请注意,以上代码并没有将更新显示的时间放在一个单独的线程中进行,因为在此问题描述中并没有提到需要实时更新显示的需求。如果确实有此需求,可以将更新显示的逻辑放在一个单独的线程中,并使用Thread.sleep()在每次更新之间添加一定的延迟时间。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 系统已结题 1月22日
  • 已采纳回答 1月14日
  • 创建了问题 1月11日

悬赏问题

  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)