您的位置:首页 > 编程语言 > Java开发

Java并发库(二):传统定时器技术回顾

2015-12-25 09:47 387 查看
深切怀念传智播客张孝祥老师,特将其代表作——Java并发库视频研读两遍,受益颇丰,记以后阅

02. 传统定时器技术回顾

传统定时器的创建:直接使用定时器类Timer【轻松实现定时关机或者过多长时间关机】

a、过多长时间后炸

new Timer().schedule(TimerTask定时任务, Date time定的时间);

b、过多长时间后炸,以后每隔多少时间再炸

newTimer().schedule(TimerTask定时任务, Long延迟(第一次执行)时间, Long间隔时间);

TimerTask与Runnable类似,有一个run方法

Timer是定时器对象,到时间后会触发炸弹(TimerTask)对象

示例:

newTimer().schedule(

new TimerTask()定时执行的任务

{

       public void run()

       {

       SOP(“bombing”);

}

显示计时信息

while (true)

{

       SOP(newDate().getSeconds());

       Thread.sleep(1000);

}

},

10    定好的延迟时间,10秒以后执行任务

);

 

new Timer().schedule(new TimerTask() {

                    

                     @Override

                     publicvoid run() {

                            System.out.println("bombing!");

                           

                     }

              }, 10000,3000);

 

问题:2秒后炸,爆炸后每隔3秒再炸一次

定时器2秒后炸,炸弹里还有定时器(每3秒炸一次)

classMyTimerTask extends TimerTask         这就是准备用的子母弹

{

       public void run()

       {

              本身就是一颗炸弹

              SOP(bombing);

              内部子弹

              new Timer().schedule(

new MyTimerTask(), 2000

);

       }

}

       放置子母弹,2秒后引爆

       newTimer().schedule(new MyTimerTask(), 2000);

问题延伸:

       上面的问题延伸,母弹炸过后,子弹每隔3秒炸一次,再每隔8秒炸一次

       1、在MyTimerTask内部定义一个静态变量记录炸弹号,在run方法内将炸弹号加1,每次产生新炸弹,号码就会加1,根据炸弹号判断是3秒炸还是8秒炸。

       注意:内部类中不能声明静态变量

       定义一个静态变量private static count = 0;

       在run方法内部:count=(count+1)%2;

       将定时器的时间设置为:2000+2000*count

       2、用两个炸弹来完成,A炸弹炸完后启动定时器安装B炸弹,B炸弹炸完后也启动一个定时器安装A炸弹。

 

定时器还可以设置具体时间,如某年某月某日某时……可以设置周一到周五做某事,自己设置的话需要换算日期时间,可以使用开源工具quartz来完成。

public class TraditionalTimerTest {

private static int count = 0;
public static void main(String[] args) {
/* new Timer().schedule(new TimerTask() {

@Override
public void run() {
System.out.println("bombing!");

}
}, 10000,3000);*/

class MyTimerTask extends TimerTask{

@Override
public void run() {
count = (count+1)%2;
System.out.println("bombing!");
new Timer().schedule(/*new TimerTask() {

@Override
public void run() {
System.out.println("bombing!");
}
}*/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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: