一、定时器的应用
1、Timer类
2、TimerTask类
二、代码实现
1、炸弹多久后爆炸,再每隔多久爆炸(连环爆炸)
/**
* @Title: TraditionalTimer.java
* @Package com.lh.threadtest
* @Description: TODO
* @author Liu
* @date 2018年1月15日 下午4:36:35
* @version V1.0
*/
package com.lh.threadtest.t2;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
/**
* @ClassName: TraditionalTimer
* @Description: 传统定时器技术
* @author Liu
* @date 2018年1月15日 下午4:36:35
*
*/
public class TraditionalTimer {
public static void main(String[] args) throws InterruptedException {
//Timer:定时器
//TimerTask:定时任务
//schedule:表示执行定时任务
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("bombing...");
}
//只有一个参数:表示多久后(ms)执行(只炸一次);第二个参数:表示每隔多久执行(ms,连环爆炸)
}, 10000,3000);
//辅助的一个显示
while(true){
TimeUnit.SECONDS.sleep(1);
System.out.println(new Date().getSeconds());
}
}
}
2、嵌套另一个TimerTask定时任务,将报错
/**
* @Title: TraditionalTimer.java
* @Package com.lh.threadtest
* @Description: TODO
* @author Liu
* @date 2018年1月15日 下午4:36:35
* @version V1.0
*/
package com.lh.threadtest.t2;
import java.util.Timer;
import java.util.TimerTask;
/**
* @ClassName: TraditionalTimer
* @Description: 传统定时器技术
* @author Liu
* @date 2018年1月15日 下午4:36:35
*
*/
public class TraditionalTimer2 {
public static void main(String[] args) throws InterruptedException {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("bombing...");
new Timer().schedule(/*new TimerTask() {
@Override
public void run() {
System.out.println("bombing...");
}
}*/this, 2000);//嵌套另一个TimerTask定时任务,将报错:java.lang.IllegalStateException: Task already scheduled or cancelled
}
}, 2000);
}
}
3、TimerTask声明明确化,并进行嵌套调用
/**
* @Title: TraditionalTimer.java
* @Package com.lh.threadtest
* @Description: TODO
* @author Liu
* @date 2018年1月15日 下午4:36:35
* @version V1.0
*/
package com.lh.threadtest.t2;
import java.util.Timer;
import java.util.TimerTask;
/**
* @ClassName: TraditionalTimer
* @Description: 传统定时器技术
* @author Liu
* @date 2018年1月15日 下午4:36:35
*
*/
public class TraditionalTimer3 {
public static void main(String[] args) throws InterruptedException {
class MyTimerTask extends TimerTask{
@Override
public void run() {
System.out.println("bombing...");
new Timer().schedule(new MyTimerTask(), 2000);
}
}
//可以正常运行的方法(每隔2s爆炸一次)
new Timer().schedule(new MyTimerTask(), 2000);
}
}
4、传统定时器技术 方案1,使用取余法
/**
* @Title: TraditionalTimer.java
* @Package com.lh.threadtest
* @Description: TODO
* @author Liu
* @date 2018年1月15日 下午4:36:35
* @version V1.0
*/
package com.lh.threadtest.t2;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
/**
* @ClassName: TraditionalTimer
* @Description: 传统定时器技术 方案1,使用取余法,交替爆炸:先2s爆炸,然后4s爆炸,如此往复...
* @author Liu
* @date 2018年1月15日 下午4:36:35
*
*/
public class TraditionalTimer4 {
private static int count = 0;
public static void main(String[] args) throws InterruptedException {
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) {
TimeUnit.SECONDS.sleep(1);
System.out.println(new Date().getSeconds());
}
}
}
5、传统定时器技术 方案2,建立两个不同的类
/**
* @Title: TraditionalTimer.java
* @Package com.lh.threadtest
* @Description: TODO
* @author Liu
* @date 2018年1月15日 下午4:36:35
* @version V1.0
*/
package com.lh.threadtest.t2;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
/**
* @ClassName: TraditionalTimer
* @Description: 传统定时器技术 方案2,建立两个不同的类:先2s爆炸,然后4s爆炸,如此往复...
* @author Liu
* @date 2018年1月15日 下午4:36:35
*
*/
public class TraditionalTimer5 {
public static void main(String[] args) throws InterruptedException {
new Timer().schedule(new MyTimerTaskA(), 2000);
while (true) {
TimeUnit.SECONDS.sleep(1);
System.out.println(new Date().getSeconds());
}
}
}
//4s后爆炸
class MyTimerTaskA extends TimerTask {
@Override
public void run() {
System.out.println("bombing...");
new Timer().schedule(new MyTimerTaskB(), 4000);
}
}
//2s后爆炸
class MyTimerTaskB extends TimerTask {
@Override
public void run() {
System.out.println("bombing...");
new Timer().schedule(new MyTimerTaskA(), 2000);
}
}