用 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 中使用 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 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 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:Java
-
本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 Java 中把 Hashmap 转换为 JSON 对象
发布时间:2023/12/17 浏览次数:187 分类:Java
-
它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。
如何在 Java 中按值排序 Map
发布时间:2023/12/17 浏览次数:171 分类:Java
-
本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map
进行排序,并列出了一些示例代码来理解它。
如何在 Java 中打印 HashMap
发布时间:2023/12/17 浏览次数:192 分类:Java
-
本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。
在 Java 中更新 Hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:Java
-
本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。
Java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:Java
-
本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,
在 Java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:Java
-
这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
Java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:Java
-
这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
Java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:Java
-
了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,