真是受够了多线程的问题,今天开始就自己总结一下
Timer类和TimerTask类配合使用。Timer负责控制线程的执行时间,TimerTask中写业务代码,他实现了Runnable接口。但run()方法并没有实现,是一个抽象类。
Timer提供的API :
schedule的不同重载方法可以,支持多少秒之后执行,间隔多长时间执行,具体某个Date执行,他提供的API并不强大,适合简单的定时任务。比如10分钟后执行。但复杂的定时任务,并没有给出相应的API,比如,每隔一月的一号执行任务。如果有这样的需求,则使用quartz。quartz这里不做详细解释,以后的文章中可能再做详解。
例:如何用timer和TimerTask实现 一个炸弹每隔2秒炸一次,另一个每隔3秒炸一次
package com.lipeng;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo {
public static int count=0;
/**
* @param args
*/
public static void main(String[] args) throws Exception{
new Timer().schedule(new BoomTimeTask(), 2000);
while(true)
{
Thread.sleep(1000);
System.out.println(new Date().getSeconds());
}
}
}
class BoomTimeTask extends TimerTask
{
@Override
public void run() {
System.out.println("boom!!!!!!!!!!!!!!!!!!!!!!!!!");
TimerDemo.count++;
new Timer().schedule(new BoomTimeTask(), TimerDemo.count%2==0?2000:3000);
}
}
思路:
1.首先schedule方法中,schedule(TimerTask task, long delay) ,delay之后执行一边线程就结束了,而schedule(TimerTask task, long delay, long period) 是delay后执行以后每period都会执行一遍run方法,并不会死掉。
2. 第一个炸弹启动2秒之后炸,炸完启动第二个炸弹,3秒之后第二个炸弹炸,再启动一次第一个炸弹,如此循环。即递归的使用炸弹,调用炸弹的方法(run方法)。每次要执行的任务一样即run方法,只不过每次的执行时间不同,每隔一次2,3秒轮流换。这就要求定义一个全局的标识count来做开关。
注:以上例子来自张孝祥老师的-Java多线程与并发库高级应用