博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java实现定时任务的三种方法
阅读量:7079 次
发布时间:2019-06-28

本文共 2256 字,大约阅读时间需要 7 分钟。

hot3.png

在本文里,我会给大家介绍3种不同的实现方法:

  • 普通thread实现

  • TimerTask实现

  • ScheduledExecutorService实现

普通thread

  这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public
class
Task1 {
public
static
void
main(String[] args) {
  
// run in a second
  
final
long
timeInterval =
1000
;
  
Runnable runnable =
new
Runnable() {
  
public
void
run() {
    
while
(
true
) {
      
// ------- code for task to run
      
System.out.println(
"Hello !!"
);
      
// ------- ends here
      
try
{
       
Thread.sleep(timeInterval);
      
}
catch
(InterruptedException e) {
        
e.printStackTrace();
      
}
      
}
    
}
  
};
  
Thread thread =
new
Thread(runnable);
  
thread.start();
  
}
}

 用Timer和TimerTask

  上面的实现是非常快速简便的,但它也缺少一些功能。

  用Timer和TimerTask的话与上述方法相比有如下好处:

  • 当启动和去取消任务时可以控制

  • 第一次执行任务时可以指定你想要的delay时间

  在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。

  Timer实例可以调度多任务,它是线程安全的。

  当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。

  下面是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import
java.util.Timer;
import
java.util.TimerTask;
public
class
Task2 {
  
public
static
void
main(String[] args) {
    
TimerTask task =
new
TimerTask() {
      
@Override
      
public
void
run() {
        
// task to run goes here
        
System.out.println(
"Hello !!!"
);
      
}
    
};
    
Timer timer =
new
Timer();
    
long
delay =
0
;
    
long
intevalPeriod =
1
*
1000
;
    
// schedules the task to be run in an interval
    
timer.scheduleAtFixedRate(task, delay,
                                
intevalPeriod);
  
}
// end of main
}

  这些类从JDK 1.3开始存在。

 ScheduledExecutorService

  ScheduledExecutorService是从Java SE 5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。

相比于上两个方法,它有以下好处:

  • 相比于Timer的单线程,它是通过线程池的方式来执行任务的

  • 可以很灵活的去设定第一次执行任务delay时间

  • 提供了良好的约定,以便设定执行的时间间隔

  下面是实现代码,我们通过ScheduledExecutorService#scheduleAtFixedRate展示这个例子,通过代码里参数的控制,首次执行加了delay时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import
java.util.concurrent.Executors;
import
java.util.concurrent.ScheduledExecutorService;
import
java.util.concurrent.TimeUnit;
public
class
Task3 {
  
public
static
void
main(String[] args) {
    
Runnable runnable =
new
Runnable() {
      
public
void
run() {
        
// task to run goes here
        
System.out.println(
"Hello !!"
);
      
}
    
};
    
ScheduledExecutorService service = Executors
                    
.newSingleThreadScheduledExecutor();
    
service.scheduleAtFixedRate(runnable,
0
,
1
, TimeUnit.SECONDS);
  
}
}

  英文原文:

转载于:https://my.oschina.net/u/1412027/blog/220394

你可能感兴趣的文章
Linux下整合Apache和Tomcat
查看>>
桌面图标右键选择发送到就会出现卡住假死
查看>>
关于旅行的文章..............搜集
查看>>
关于VLOOUP函数与index match函数
查看>>
Netscaler重置密码的方法
查看>>
MySQL内存设置—— MySQL server has gone away
查看>>
Java语言中的----运算符
查看>>
Cannot Register the virtual hard
查看>>
Linux系统的各种后门和日志工具详细介绍
查看>>
支付宝及时到账支付成功返回信息
查看>>
linux基础之bash基础
查看>>
MyEclipse 快捷键
查看>>
jQuery data- 取值
查看>>
05-k8s-fannel
查看>>
冷饭热炒-谈DOS和DDOS***
查看>>
ntop的安装与使用
查看>>
ES Java API_基于bulk实现多4S店销售数据批量上传
查看>>
TypeScript基础入门之JSX(二)
查看>>
根据某一字段值相同合并字符串 - - SQL
查看>>
django-关于JSON编码格式的异常处理
查看>>