You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java烤面包服务:实现temp每2秒自增1并实时推送状态更新

实现带定时状态更新的烤面包功能

嘿,我来帮你搞定这个烤面包机的定时状态更新需求!你的原始代码是同步阻塞的循环,直接跑起来会瞬间完成temp递增,完全达不到每2秒更新一次的效果。我们需要改成异步定时任务来处理,同时还要保证线程安全,避免多线程下的状态混乱。

以下是修改后的完整可运行实现:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Toaster {
    // 用volatile保证多线程下变量可见性,避免线程缓存导致的状态不一致
    private volatile int temp = 0;
    private volatile boolean toasting = false;
    private int breadLevel;
    // 创建单线程定时任务池,复用线程更高效
    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    public void Toasting() {
        if (breadLevel >= 0) {
            toasting = true;
            // 每次启动烘烤前重置temp,避免上次的残留值影响流程
            temp = 0;
            System.out.println("开始烤面包啦!");

            // 提交定时任务:立即执行第一次,之后每2秒执行一次
            scheduler.scheduleAtFixedRate(() -> {
                if (temp < 5) {
                    temp++;
                    // 这里模拟向用户发送状态更新,实际场景可以换成通知UI、调用推送接口等
                    System.out.println("🍞 烤面包状态更新:当前温度等级 -> " + temp);

                    // 当temp达到5时,结束烘烤流程
                    if (temp == 5) {
                        toasting = false;
                        System.out.println("🎉 烤面包完成!可以享用啦~");
                        // 关闭定时任务池(如果烤面包机需要重复使用,可不关闭,改用标志位控制任务启停)
                        scheduler.shutdown();
                    }
                }
            }, 0, 2, TimeUnit.SECONDS);
        } else {
            toasting = false;
            System.out.println("⚠️ 烤面包机里没有面包,无法启动烘烤哦");
        }
        System.out.println("当前面包量:" + breadLevel);
    }

    // 示例:设置面包量的方法,方便外部控制
    public void setBreadLevel(int breadLevel) {
        this.breadLevel = breadLevel;
    }

    // 测试用main方法
    public static void main(String[] args) throws InterruptedException {
        Toaster myToaster = new Toaster();
        myToaster.setBreadLevel(3); // 设置有面包
        myToaster.Toasting();
        // 主线程等待一段时间,避免程序直接退出(实际业务中不需要,这里只是为了看效果)
        Thread.sleep(12000);
    }
}

核心细节拆解:

  • 异步定时任务:用ScheduledExecutorService的scheduleAtFixedRate替代同步while循环,既能实现每2秒执行一次的逻辑,又不会阻塞主线程(比如GUI应用不会卡界面)。
  • 线程安全保障:用volatile修饰temp和toasting,确保这些共享变量在多线程环境下的修改能被所有线程及时感知,避免出现状态不一致的问题。
  • 状态更新触发:每次temp自增后,立刻输出状态信息(你可以把这个打印换成实际的用户通知逻辑,比如前端弹窗、APP推送等)。
  • 任务终止逻辑:当temp达到5时,自动切换toasting状态为false,并关闭定时任务池(如果你的烤面包机需要重复使用,可以改成用一个标志位来控制任务是否继续执行,而不是直接关闭池子)。
  • 重置初始状态:每次启动烘烤前重置temp,防止上次烘烤的残留值干扰本次流程。

额外小提示:

  • 如果是在Spring这类框架里开发,可以直接用@Scheduled注解来简化定时任务的配置,核心逻辑和上面是一致的。
  • 如果需要支持中途取消烘烤,可以加一个cancelToasting方法,调用scheduler.shutdownNow()并重置toasting和temp状态。

内容的提问来源于stack exchange,提问作者user9409047

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:22:31