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();
}
}
}
}
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();
}
}
}
}
相关文章推荐
- JAVA 基础之Integer
- 单例模式
- quartz 定时器cron表达式全解析
- quartz 定时器cron表达式全解析
- java 中字符串比较equals()和equalsIgnoreCase()的区别
- java实现附件预览(openoffice+swftools+flexpaper)
- Java并发库(一):传统线程技术回顾
- Eclipse Java颜色设置
- [javase学习笔记]-7.5 构造函数需要注意的几个细节
- java中的缓存技术该如何实现
- JAVA缓存技术
- 配置Java jdk(备忘)
- eclipse 打开其他项目的jar源码 乱码解决
- 在eclipse中调试服务器中的项目
- Java文件操作系列[1]——PDFBox实现分页提取PDF文本
- Java线程(一):线程安全与不安全
- Java高级部分容器重点总结上
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- Java web项目中java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- 详解Java的JDBC中Statement与PreparedStatement对象