1、普通方式

 /**
* 普通thread
* 这是最常见的,创建一个thread,然后让它在while循环里一直运行着,
* 通过sleep方法来达到定时任务的效果。这样可以快速简单的实现
*/
public static void main(String[] args)
{ //定时任务1 通过普通线程
final long timeInterval = 1000;
Runnable runnable = new Runnable(){ @Override
public void run()
{
while (true)
{
long currentTime = System.currentTimeMillis();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
Date date = new Date(currentTime);
System.out.println("hello,"+formatter.format(date));
try
{
Thread.sleep(timeInterval);
}
catch (InterruptedException e)
{ }
}
} };
Thread a = new Thread(runnable);
a.start();
}

2、Timer和TimerTask

 /**
* 于第一种方式相比,优势 1>当启动和去取消任务时可以控制 2>第一次执行任务时可以指定你想要的delay时间
* 在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。 Timer实例可以调度多任务,它是线程安全的。
* 当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。
* 缺陷:首先Timer对调度的支持是基于绝对时间的,而不是相对时间,所以它对系统时间的改变非常敏感。其次Timer线程是不会捕获异常的,
* 如果TimerTask抛出的了未检查异常则会导致Timer线程终止,同时Timer也不会重新恢复线程的执行,他会错误的认为整个Timer线程都会取消。
* 同时,已经被安排单尚未执行的TimerTask也不会再执行了,新的任务也不能被调度。故如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。
* @param args
*/
public static void main(String[] args)
{
TimerTask task = new TimerTask(){ @Override
public void run() {
long currentTime = System.currentTimeMillis();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
Date date = new Date(currentTime);
System.out.println("hello,"+formatter.format(date));
} }; TimerTask task2 = new TimerTask(){ @Override
public void run() {
long currentTime = System.currentTimeMillis();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
Date date = new Date(currentTime);
System.out.println("hello2,"+formatter.format(date));
} };
Timer timer = new Timer();
long delay = 0;
long intevalPeriod = 1*1000;
//timer.scheduleAtFixedRate(task, delay, intevalPeriod);
//timer.scheduleAtFixedRate(task2, delay, intevalPeriod);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date;
try
{
date = sdf.parse("2016-09-27 15:16:00");
timer.schedule(task2, date, intevalPeriod);
}
catch (ParseException e)
{
e.printStackTrace();
}
}

3、java.util.concurrent.ScheduledExecutorService

 /**
* ScheduledExecutorService是从Java SE5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。
* 相比于上两个方法,它有以下好处:
* 1>相比于Timer的单线程,它是通过线程池的方式来执行任务的
* 2>可以很灵活的去设定第一次执行任务delay时间
* 3>提供了良好的约定,以便设定执行的时间间隔
* @param args
*/
public static void main(String[] args)
{
Runnable runnable = new Runnable(){ @Override
public void run() {
long currentTime = System.currentTimeMillis();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
Date date = new Date(currentTime);
System.out.println("hello2,"+formatter.format(date));
} };
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
service.scheduleAtFixedRate(runnable,10,1,TimeUnit.SECONDS);
}

4、使用调度框架:quartz

http://www.quartz-scheduler.org/

最新文章

  1. Try-Catch机制使用场景分析
  2. Redis 数据结构使用场景
  3. mysql日志类型
  4. “耐撕”团队 2016.04.08 站立会议
  5. git简介及安装配置
  6. HDU 3466
  7. V&View更新
  8. android 控件花屏问题
  9. react入门到进阶(二)
  10. vue(1)——node.js安装使用,利用npm安装vue
  11. python 最大连续子数组的和
  12. vue-router 管理视图详解
  13. shell编程 之 ssh远程连接
  14. Django-组件拾遗
  15. P3813 [FJOI2017]矩阵填数(组合数学)
  16. POJ 2049— Finding Nemo(三维BFS)10/200
  17. CentOS(学习笔记一)
  18. 进阶系列(8)——匿名方法与lambda表达式
  19. jquery.autocomplete修改 实现键盘上下键 自动填充
  20. 如何在VC6.0下用pthread.h这个头文件

热门文章

  1. java导出excel报表
  2. java开发之多线程需要学习和理解的东西
  3. Proxifier设置代理
  4. APIO2015题解
  5. 让IE6下支持固定定位
  6. I.MX6 git patch
  7. zoj 2027 Travelling Fee
  8. C#中的值类型(value type)与引用类型(reference type)的区别
  9. 10、TV UI
  10. HDU5697 刷题计划 dp+最小乘积生成树