传统定时器的创建,直接使用定时器类Timer即可。
现在我们模拟定时炸弹的爆炸,Timer相当于定时器对象,TimerTask中的run()方法相当于炸弹,Timer到时间后会触发TimerTask执行run()方法中的内容。
示例一:炸弹10秒后触发
public static void main(String[] args) {
new Timer().schedule(new TimerTask(){
//重写TimerTask中的run方法
@Override
public void run() {
System.out.println("bombing!");
}
}, 10000);//10秒后触发
while(true) {
//打印当前时间
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
示例二:10秒后触发,再每隔3秒触发一次
public static void main(String[] args) {
new Timer().schedule(new TimerTask(){
//重写TimerTask中的run方法
@Override
public void run() {
System.out.println("bombing!");
}
}, 10000,3000);//10秒后触发,再每隔3秒执行一次
while(true) {
//打印当前时间
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
注意:上述代码即使没有while循环,也一样会执行。
示例三:2秒后炸,爆炸后每隔3秒再炸一次(示例二的另一种实现方式)
package tradition;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TwoAndThree {
public static void main(String[] args) {
/**
* 在main方法中自定义内部类
*/
class MyTimerTask extends TimerTask{
@Override
public void run() {
System.out.println("bombing!");
//定时器内部又定义了一个定时器
new Timer().schedule(new MyTimerTask(), 3000);
}
}
new Timer().schedule(new MyTimerTask(), 2000);
while(true) {
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果示例:
45
46
bombing!
47
48
49
bombing!
实例四:要求母炸弹2秒后炸,子炸弹按照4秒和2秒轮循炸
1、方式一:定义一个静态变量,在run方法中将变量加一,通过除2取余的方式炸
package tradition;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* 传统定时器
*/
public class TraditionalTimerTest {
//声明一个静态变量
private static int count = 0;
public static void main(String[] args) {
/**
* 在main方法中自定义内部类
*/
class MyTimerTask extends TimerTask{
@Override
public void run() {
count = (count + 1)%2;
System.out.println("bombing!");
//定时器内部又定义了一个定时器
new Timer().schedule(new MyTimerTask(),
2000 + 2000*count);
}
}
new Timer().schedule(new MyTimerTask(), 2000);
while(true) {
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果:
30
31
MyTimerTask1 bombing!
32
33
34
35
MyTimerTask2 bombing!
2、方式二:用两个炸弹来完成,A炸弹炸完后启动定时器安装B炸弹,B炸弹炸完后也启动一个定时器安装A炸弹
package tradition;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* 传统定时器
*/
public class TraditionalTimerTest {
//声明一个静态变量
private static int count = 0;
public static void main(String[] args) {
new Timer().schedule(new MyTimerTask1(), 2000);
while(true) {
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyTimerTask1 extends TimerTask{
@Override
public void run() {
System.out.println("MyTimerTask1 bombing!");
new Timer().schedule(new MyTimerTask2(), 4000);
}
}
class MyTimerTask2 extends TimerTask{
@Override
public void run() {
System.out.println("MyTimerTask2 bombing!");
new Timer().schedule(new MyTimerTask1(), 2000);
}
}
定时器还可以设置具体时间,如某年某月某日某时……可以设置周一到周五做某事,自己设置的话需要换算日期时间,可以使用开源工具quartz来完成。
参考视频:《Java多线程与并发库高级应用》