java API中ScheduledExecutorService定时器的使用

package com.timer;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 异常监听定时器
 * @author Administrator
 *
 */
public class SMSTimerTask{
      int i = 1; //设定一个判断的标准,当然了,可以根据自己的项目需要设置判断的标准是什么,我这里只是做了简单的例子程序
     // 线程池能按时间计划来执行任务,允许用户设定计划执行任务的时间,int类型的参数是设定
     // 线程池中线程的最小数目。当任务较多时,线程池可能会自动创建更多的工作线程来执行任务
     public ScheduledExecutorService scheduExec = Executors
             .newScheduledThreadPool(10);
 
     // 启动计时器,叫这个名字有点怪怪的,因为是例子,而且调用这个方法后,lanuchTimer()方法确实就开始运行,所有干脆就起了这么一个名字
     public void lanuchTimer() {
           Runnable task = new Runnable() {
                 public void run() {
                 System.out.println(“第”+i+++”次运行”);
             }
         };
         scheduExec.scheduleWithFixedDelay(task, 1000 * 5, 1000 * 10,
                                                                             TimeUnit.MILLISECONDS);
     }
 
     // 添加一个新监听到的任务  这个你就可以对你想要监听的异常地方在run()方法中进行相应的处理
     public void addOneTask(final String a) {
           Runnable task = new Runnable() {
           public void run() {
                 i++;
                 System.out.println(“welcome to china “+a);
                 if(i == 4){
                      System.out.print(“已经尝试执行三次,但链接还是未成功,记录状态,终止当前线程操作!”);
                      scheduExec.shutdownNow();
                 }else{
               
                  }
             }
         };
         //启动当前任务
      scheduExec.scheduleAtFixedRate(task, 1, 5,
                 TimeUnit.SECONDS); 
     }
     public static void main(String[] args) throws Exception {
          SMSTimerTask testA = new SMSTimerTask();
          SMSTimerTask testB = new SMSTimerTask();
          //test.lanuchTimer();
          //Thread.sleep(1000 * 5);    // 5秒钟之后添加新任务
          testA.addOneTask(“aaa”);
          testB.addOneTask(“bbb”);
     }
}

/**

   具体的请看util包底下的三个类,学习java基础就这样,使劲抠最基本的东西   java.util.concurrent

    一下是网上找的内容:

     TimerScheduledThreadPoolExecutor

      但ScheduledThreadPoolExecutor和Timer相比具有以下优点:

      Timer对调度的支持是基于绝对时间的,因此任务对系统时间的改变是敏感的;而ScheduledThreadPoolExecutor支持相对时间。

       Timer使用单线程方式来执行所有的TimerTask,如果某个TimerTask很耗时则会影响到其他TimerTask的执行;而ScheduledThreadPoolExecutor则可以构造一个固定大小的线程池来执行任务。

       Timer不会捕获由TimerTask抛出的未检查异常,故当有异常抛出时,Timer会终止,导致未执行完的TimerTask不再执行,新的TimerTask也不能被调度;ScheduledThreadPoolExecutor对这个问题进行了妥善的处理,不会影响其他任务的执行。

     因此在JDK1.5以后就基本上都是使用ScheduledThreadPoolExecutor了。

  想要了解的更深,就使劲抠API文档吧 

*/

 

 

 

    原文作者:牛肉羊杂汤
    原文地址: http://www.cnblogs.com/hunter-zyg/articles/3167392.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞