zoukankan      html  css  js  c++  java
  • Java 任务调度

    1、普通方式

     1 /**
     2      * 普通thread 
     3      * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, 
     4      * 通过sleep方法来达到定时任务的效果。这样可以快速简单的实现
     5      */
     6     public static void main(String[] args)
     7     {
     8         
     9         //定时任务1  通过普通线程
    10         final long timeInterval = 1000;
    11         Runnable runnable = new Runnable(){
    12 
    13             @Override
    14             public void run() 
    15             {
    16                 while (true)
    17                 {
    18                     long currentTime = System.currentTimeMillis();
    19                     SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒");
    20                     Date date = new Date(currentTime);
    21                     System.out.println("hello,"+formatter.format(date));
    22                     try 
    23                     {
    24                         Thread.sleep(timeInterval);
    25                     } 
    26                     catch (InterruptedException e) 
    27                     {
    28                         
    29                     }
    30                 }
    31             }
    32             
    33         };
    34         Thread a = new Thread(runnable);
    35         a.start();
    36     }
    37     

    2、Timer和TimerTask

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

    3、java.util.concurrent.ScheduledExecutorService

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

     4、使用调度框架:quartz 

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

  • 相关阅读:
    事务
    MySQL删除表的方式
    建立索引的原则
    对表设置引擎
    运算符
    数据库锁简介
    为什么对表设置主键
    php苹果原生apns推送接口
    华为推送
    php操作redis
  • 原文地址:https://www.cnblogs.com/cac2020/p/5913086.html
Copyright © 2011-2022 走看看