用 Java 制作倒数计时器

Rupam Yadav 2023年1月30日 2021年6月29日
  1. Java 中使用 ScheduledExecutorService 的倒数计时器
  2. Java 中使用 TimerTimerTask 的倒数计时器
用 Java 制作倒数计时器

今天,我们将演示如何在不依赖任何第三方库的情况下使用两种方法在 Java 中制作倒数计时器。我们可以在 GUI 窗口或控制台中使用计时器来测试它。看看我们下面的代码!

Java 中使用 ScheduledExecutorService 的倒数计时器

在第一个方法中,我们使用 ExecutorService 接口调用其方法 newScheduledThreadPool(),该方法创建一个使用相同固定数量分配线程的线程池。在 newScheduledThreadPool() 方法中,我们传递了我们想要在池中的线​​程数。在这种情况下,我们只需要一个线程来运行计时器。

Executors.newScheduledThreadPool() 函数返回一个 ScheduledExecutorService 对象,我们将其命名为 scheduler。接下来,我们从 Runnable 接口覆盖 run() 方法。Runnable 实例用于执行线程。在 Runnable 中,我们创建了一个变量 countdownStarter 并使用我们想要启动倒数计时器的秒数对其进行初始化。

现在在 run() 方法中,我们打印 countdownStarter,并将其值减一。为了在计时器达到零时停止计时器,我们创建了一个条件来检查 countdownStarter 值。如果它的值小于零,它会打印一条消息并关闭 scheduler,它是使用 scheduler.shutdown() 命令的 Executor Service。

最后,我们使用 scheduler 对象调用 scheduleAtFixedRate() 方法,该方法定期运行给定的操作并接受四个参数。第一个参数是 runnable 实例;第二个是第一次执行的时间延迟;三是动作之间的延迟。在这里,正如第四个参数所暗示的那样,我们将延迟设为应等于一秒。

import java.util.concurrent.*;

import static java.util.concurrent.TimeUnit.SECONDS;

public class Countdown {
    public static void main(String[] args) {

        final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

        final Runnable runnable = new Runnable() {
            int countdownStarter = 20;

            public void run() {

                System.out.println(countdownStarter);
                countdownStarter--;

                if (countdownStarter < 0) {
                    System.out.println("Timer Over!");
                    scheduler.shutdown();
                }
            }
        };
        scheduler.scheduleAtFixedRate(runnable, 0, 1, SECONDS);
    }
}

输出:

20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Timer Over!

Java 中使用 TimerTimerTask 的倒数计时器

在这个例子中,我们使用了 java.util 包附带的两个类,TimerTimerTask。这两个类都用于调度在后台线程中执行的任务。在这个例子中,我们使用 jFrame 对象在 GUI 窗口中显示计时器。首先,我们创建一个 jFrame 对象,然后是一个显示计时器文本的 jLabel。我们将框架的布局设置为 FlowLayout(),并设置窗口的位置和大小。

接下来,我们将 jLabel 添加到框架中。为了创建倒数计时器,我们创建了一个 Timer 对象并调用它的方法 scheduleAtFixedRate(),顾名思义,它以固定的速率安排和重复指定的任务。

现在,由于 scheduleAtFixedRate() mate 将 TimerTask 对象作为它的第一个参数,我们使用 new TimerTask() 创建一个对象。对于第二个和第三个参数,它们安排要执行的任务以及每次执行之间的时间间隔(以毫秒为单位)。

下一步,我们需要创建一个变量并用我们想要开始倒计时的数字初始化它。然后,我们调用 run() 方法并将 jLabel 组件的文本设置为 i。要停止计时器,我们调用 timer.cancel()

import javax.swing.*;
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;

public class Countdown {
    public static void main(String[] args) {

        JFrame jframe = new JFrame();
        JLabel jLabel = new JLabel();
        jframe.setLayout(new FlowLayout());
        jframe.setBounds(500, 300, 400, 100);

        jframe.add(jLabel);
        jframe.setVisible(true);

        Timer timer = new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {
            int i = 20;

            public void run() {

                jLabel.setText("Time left: " + i);
                i--;

                if (i < 0) {
                    timer.cancel();
                    jLabel.setText("Time Over");
                }
            }
        }, 0, 1000);
    }
}

输出:

java 倒数计时器

Author: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

相关文章 - Java Timer