创建一个循环之间有一秒间隔的循环[处理代码中的异常]

Posted

技术标签:

【中文标题】创建一个循环之间有一秒间隔的循环[处理代码中的异常]【英文标题】:Creating a loop that has a one second gap between loops [Handling Exceptions in the code] 【发布时间】:2020-03-25 00:55:20 【问题描述】:

我正在尝试创建一个倒数计时器,它将更新 Java 中的 Jlabel 以用于测验应用程序。到目前为止,我的代码有这个,但它给sleep() 方法提供了一个错误,并且没有运行我的程序。

while (timer > 0) 
     lblTimer.setText(Integer.toString(timer));
     Thread.sleep(1000);
     timer--;

【问题讨论】:

it gives an error - 什么错误? 你是在主线程上运行这段代码吗? Thread.sleep() 只能抛出InterruptedException 这正是我添加它时所说的。中断异常 '未处理的异常类型 InterruptedException' 【参考方案1】:
class JlabelUpdater 
   private JLabel label;
   private Integer timerTickCount;
   private Integer tickerIntervalInMillis;
   private ScheduledExecutorService scheduledExecutorService = 
           Executors.newScheduledThreadPool(1);

   public JlabelUpdater(JLabel label, Integer timerTickCount, 
                        Integer tickerIntervalInMillis) 
      this.label = label;
      this.timerTickCount = timerTickCount;
      this.tickerIntervalInMillis = tickerIntervalInMillis;
   

   public void startTimer() 
     scheduledExecutorService.scheduleAtFixedRate(() -> 
        if (timerTickCount == 0) 
           scheduledExecutorService.shutdown();
        

        System.out.println("timer running: " + timerTickCount);
          changeText(timerTickCount + "");
          timerTickCount--;
         , 0, tickerIntervalInMillis, TimeUnit.MILLISECONDS);
   

   private void changeText(final String text) 
      EventQueue.invokeLater(() -> 
             label.setText(text);
             System.out.println("text = " + text);
         
      );
   

如果你想要一个 5 秒的计时器并每 1 秒更新一次 JLabel 文本,你可以创建一个此类的对象并像这样调用它。

new JlabelUpdater(new JLabel(), 5, 1000).startTimer();

始终建议使用ScheduledExecutorService 而不是Timer 尽可能。

【讨论】:

肯定有一种更简单的方法,就是在一个循环中设置一个标签,等待 1 秒,然后更改标签中的值? simple 完全是上下文相关的,3 行代码可能看起来很简单,但复杂程度不同。在并发世界中线程不是一件简单的事情。要指出一些,您不应该休眠参与用户交互的主/UI线程,并且您不能从后台/工作线程更新UI元素,因为UI元素是主线程受限的。这个列表还在继续......【参考方案2】:

添加try catch块来捕获异常

     while (timer > 0) 
            lblTimer.setText(Integer.toString(timer));
            try 
                Thread.sleep(1000);
             catch (InterruptedException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
            timer--;

           

【讨论】:

当我尝试程序根本不加载时。

以上是关于创建一个循环之间有一秒间隔的循环[处理代码中的异常]的主要内容,如果未能解决你的问题,请参考以下文章

怎么用jQuery实现轮流间隔几秒循环显示?!

在pycharm中,打开文件后间隔一秒读取一行,共读5行

Java 异常处理和循环继续

怎么在java main方法里用一个线程的sleep()方法让一个循环执行一次后阻塞一秒再循环下一次

创建一个精确的时间间隔,在很长一段时间内没有漂移

使用 RestTemplate 在循环中处理异常