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
相关产品推荐
相关产品推荐

