一、定时器的应用
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); } }