Java中实现代码的延迟执行
https://blog.csdn.net/xuwei198995/article/details/10136759
延时执行
间隔某段时间之后,再去执行某段代码,实现这种结果有两种方式:
1)使用Sleep方法,就是去新建一个线程,然后里边放一个Thread.sleep()方法,这也是比较通俗的做法。
new Thread(){
public void run(){
try {
Thread.sleep(5000);
System.out.println("love");
} catch (InterruptedException e) { }
}
}.start(); //这种内部匿名类的写法,快速生成一个线程对象,也有利于快速垃圾回收
但在main方法里直接加入Thread.sleep(),是对main线程的休眠;另一种错误的方法是把Thread.sleep放在一个方法内,而这个方法也是在main方法体内调用,与前者结果一样。
当然也可以使用 Java API 提供的Timer类,来实现。如下代码所示:
public class TimerDemo {
public static void main(String[] args) {
final Timer timer=new Timer(); TimerTask task=new TimerTask(){
public void run(){
System.out.println("计时任务");
//timer.cancel(); 终止此计时器,丢弃所有当前已安排的任务。这不会干扰当前正在执行的任务(如果存在)。一旦终止了计时器,那么它的执行线程也会终止,并且无法根据它安排更多的任务。注意,在此计时器调用的计时器任务的 run 方法内调用此方法,就可以绝对确保正在执行的任务是此计时器所执行的最后一个任务。
}
};
timer.schedule(task,5000, 2000); //这个命令就是5秒钟之后执行TimerTask里边的内容,后边的执行时间间隔为2秒钟。
}
}
通过调试发现,创建一个Timer对象,就会创建一个main线程之外的独立子线程程序,来专门执行计时器里的任务,而任务也被理解成为对象:TimerTask,这也体现了JAVA中一切皆是对象的理念。一个Timer里即使有多个TimerTask对象,也只会开启一个线程来应付。简单的时间延迟还是推荐用第一种方案,当然如果有间隔性的执行,只能用第二种。如果硬要第一种方案实现间隔性的执行,只能引入线程池来解决,那样就杀鸡用牛刀了。
2)现在SUN推出新的解决方案,beepForAnHour设置了 ScheduledExecutorService ,在 1 小时内每 10 秒钟蜂鸣一次:
import static java.util.concurrent.TimeUnit.SECONDS;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
class BeeperControl {
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1); //创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。池中所保存的线程数为1个,即使线程是空闲的也包括在内。
public void beepForAnHour() {
final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); }
};
final ScheduledFuture
原文地址:https://www.cnblogs.com/longjiajiajia/p/11393872.html
- Final 关键字
- ArrayList 和 LinkedList的执行效率比较
- 关于consistent gets(r5笔记第12天)
- wait/notify 实现多线程交叉备份
- 01.SVN介绍与安装
- 由sqlplus中的一个小细节所做的折腾(r5笔记第11天)
- 浅析多线程的对象锁和Class锁
- 使用strace诊断奇怪的sqlplus登录问题(r5笔记第29天)
- 读书笔记 之《Thinking in Java》(对象、集合、异常)
- 深度解析dba_segments和sys.seg$中的细节差异(上) (r5笔记第27天)
- 【大牛经验】26种语言输出HelloWord
- 深度解析dba_segments和sys.seg$中的细节差异(下) (r5笔记第28天)
- Linux命令(面试+工作版)
- 纠结的paste格式问题(未解决) (r5笔记第26天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【Python】使用Pygame做一个Flappy bird小游戏(三)
- Godot游戏开发实践之三:容易被忽视的Resource
- 方便快捷的调试 Node.js 程序
- LeetCode 06Z字形变换&07整数反转
- 对搜索表单提交是否为空进行弹出提示
- PWN入门(Fastbin Attack)
- Qt项目网络聊天室设计
- nginx 端口转发
- linux通用链表
- 什么情况用ArrayList or LinkedList呢?
- Dubbo系列-扬帆起航
- 使用 Horoscope 测试 TiDB 优化器
- 聊聊claudb的importRDB
- 【17期】什么情况用ArrayList or LinkedList呢?
- YOLO V3网络结构解析