如何在Java代码行之间设置等待时长?附JOptionPane弹窗场景示例
在两个Swing弹窗之间添加2小时等待的解决方案
嘿,我来帮你搞定这个需求!在Swing里直接加等待得注意线程问题,不然会把界面卡死,下面给你两种靠谱的方案,你可以根据情况选:
方案1:后台线程 + Thread.sleep()(适合需后台操作的场景)
如果等待期间你还想跑点别的后台任务,这个方案更灵活。但要记住绝对不能直接在Swing的事件调度线程(EDT)里sleep,不然整个界面会冻住,用户啥操作都做不了。
代码示例:
import javax.swing.JOptionPane; import javax.swing.SwingUtilities; public class WaitExample { public static void main(String[] args) { // 显示第一个提示框 JOptionPane.showMessageDialog(null, "2 hours left"); // 开个新线程处理等待逻辑 new Thread(() -> { try { // 把2小时转换成毫秒:2*60分钟*60秒*1000毫秒 = 7200000 Thread.sleep(7200000); // 等待结束后,必须回到EDT更新UI(Swing组件只能在EDT里操作) SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(null, "2 hours ago"); }); } catch (InterruptedException e) { // 处理中断异常,比如打日志或者做清理 e.printStackTrace(); } }).start(); } }
方案2:Swing Timer(推荐!更简洁安全)
Swing自带的Timer是专门为UI定时任务设计的,它会自动在EDT上执行任务,不用手动处理线程切换,代码更干净,也符合Swing的规范。
代码示例:
import javax.swing.JOptionPane; import javax.swing.Timer; public class SwingTimerExample { public static void main(String[] args) { // 显示第一个提示框 JOptionPane.showMessageDialog(null, "2 hours left"); // 设置延迟时间:2小时 = 7200000毫秒 int twoHoursInMillis = 2 * 60 * 60 * 1000; // 创建定时器,只执行一次 Timer timer = new Timer(twoHoursInMillis, e -> { // 时间到了显示第二个提示框 JOptionPane.showMessageDialog(null, "2 hours ago"); }); timer.setRepeats(false); // 确保只触发一次 timer.start(); } }
方案选择建议
- 如果只是单纯等时间弹第二个框,优先选Swing Timer,代码更简洁,也不会踩线程的坑;
- 如果等待期间需要执行后台任务(比如监控文件变化、同步数据),就用后台线程的方案。
另外要注意:如果程序在等待期间被关闭了,第二个弹窗就不会显示了,要是需要程序保持运行,得确保线程是守护线程或者处理好关闭逻辑哦~
内容的提问来源于stack exchange,提问作者user12312714
相关产品推荐
相关产品推荐

