用 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 static java.util.concurrent.TimeUnit.SECONDS;
import java.util.concurrent.*;
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 中使用 Timer
和 TimerTask
的倒数计时器
在这个例子中,我们使用了 java.util
包附带的两个类,Timer
和 TimerTask
。这两个类都用于调度在后台线程中执行的任务。在这个例子中,我们使用 jFrame
对象在 GUI 窗口中显示计时器。首先,我们创建一个 jFrame
对象,然后是一个显示计时器文本的 jLabel
。我们将框架的布局设置为 FlowLayout()
,并设置窗口的位置和大小。
接下来,我们将 jLabel
添加到框架中。为了创建倒数计时器,我们创建了一个 Timer
对象并调用它的方法 scheduleAtFixedRate()
,顾名思义,它以固定的速率安排和重复指定的任务。
现在,由于 scheduleAtFixedRate()
mate 将 TimerTask
对象作为它的第一个参数,我们使用 new TimerTask()
创建一个对象。对于第二个和第三个参数,它们安排要执行的任务以及每次执行之间的时间间隔(以毫秒为单位)。
下一步,我们需要创建一个变量并用我们想要开始倒计时的数字初始化它。然后,我们调用 run()
方法并将 jLabel
组件的文本设置为 i
。要停止计时器,我们调用 timer.cancel()
。
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
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);
}
}
输出:
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