zoukankan      html  css  js  c++  java
  • Timer和ScheduledExecutorService区别

    Timer特点:

     
    1、一个Timer只占用一个线程
    timer有多个timerTask的情况,如果一个timerTask有执行时间过长,其它的timerTask就会被耽误
    2、如果TimerTask抛出未检查的异常,Timer会由于该异常导致中断。后续的TimerTask任务也不会执行
    示例:
     1 import java.util.Date;
     2 import java.util.Timer;
     3 import java.util.TimerTask;
     4  
     5 public class TimerTest extends TimerTask {
     6  
     7         private String jobName = "" ;
     8  
     9         public TimerTest(String jobName) {
    10                super();
    11                this.jobName = jobName;
    12        }
    13  
    14         int count = 0;
    15  
    16         @Override
    17         public void run() {
    18               System. out.println(jobName + " " + new Date() + " beep " + (++count));
    19                try {
    20                       if (jobName .equals("job1" )) {
    21                            Thread. sleep(1000);
    22                             throw new RuntimeException();
    23                      }
    24  
    25               } catch (InterruptedException e) {
    26                       // TODO Auto-generated catch block
    27                      e.printStackTrace();
    28               }
    29        }
    30  
    31         public static void main(String[] args) {
    32               Timer timer = new Timer();
    33                long period = 2000;
    34                // 从现在开始 1 秒钟之后,每隔 2秒钟执行一次 job1
    35               timer.schedule( new TimerTest("job1" ), 0, period);
    36                // 每隔 2 秒钟执行一次 job2
    37               timer.schedule( new TimerTest("job2" ), 0, period);
    38        }
    39 }
    40 执行结果
    41 job1 Tue Apr 08 23:37:17 CST 2014 beep 1
    42 Exception in thread "Timer-0" java.lang.RuntimeException
    43        at TimerTest.run( TimerTest.java:20)
    44        at java.util.TimerThread.mainLoop( Timer.java:512)
    45        at java.util.TimerThread.run( Timer.java:462)
    ScheduledExecutorService(实现类ScheduledThreadPoolExecutor)特点:
    1、ScheduledExecutorService是多线程
    只要线程池不设置为1,每个线程任务都能按照各自的频率执行。
    2、如果线程任务抛出未检查的异常,ScheduledExecutorService只是中断该线程任务,其它任务正常执行
    示例:
     1 import static java.util.concurrent.TimeUnit.SECONDS;
     2 import java.util.Date;
     3 import java.util.TimerTask;
     4 import java.util.concurrent.Executors;
     5 import java.util.concurrent.ScheduledExecutorService;
     6 import java.util.concurrent.ScheduledFuture;
     7  
     8 public class TestScheduledThread extends TimerTask {
     9  
    10         private String jobName = "" ;
    11  
    12         public TestScheduledThread(String jobName) {
    13                super();
    14                this.jobName = jobName;
    15        }
    16  
    17         int count = 0;
    18  
    19         @Override
    20         public void run() {
    21               System. out.println(jobName + " " + new Date() + " beep " + (++count));
    22                try {
    23                       if (jobName .equals("job1" )) {
    24                            Thread. sleep(1000);
    25                             throw new RuntimeException();
    26                      }
    27  
    28               } catch (InterruptedException e) {
    29                       // TODO Auto-generated catch block
    30                      e.printStackTrace();
    31               }
    32        }
    33  
    34         public static void main(String[] args) {
    35                final ScheduledExecutorService scheduler = Executors
    36                            . newScheduledThreadPool(2);
    37                //每隔2秒运行一次
    38                final ScheduledFuture beeperHandle = scheduler.scheduleAtFixedRate(
    39                             new TimerTest("job1" ), 0, 2, SECONDS);
    40                //每隔2秒运行一次
    41                final ScheduledFuture beeperHandle2 = scheduler.scheduleAtFixedRate(
    42                             new TimerTest("job2" ), 0, 2, SECONDS);
    43        }
    44 }
     
    执行结果:
    job2 Tue Apr 08 23:42:58 CST 2014 beep 1
    job1 Tue Apr 08 23:42:58 CST 2014 beep 1
    job2 Tue Apr 08 23:43:00 CST 2014 beep 2
    job2 Tue Apr 08 23:43:02 CST 2014 beep 3
    job2 Tue Apr 08 23:43:04 CST 2014 beep 4
    job2 Tue Apr 08 23:43:06 CST 2014 beep 5
    job2 Tue Apr 08 23:43:08 CST 2014 beep 6
  • 相关阅读:
    Java自带工具jstack故障分析的一个案例
    当spring 容器初始化完成后执行某个方法
    tomcat的maxThreads、acceptCount(最大线程数、最大排队数)
    RESTful API 设计指南
    GitHub简单使用入门
    Newton's method
    把一个文件夹下的多个excel文件合并到同一个excel的一个sheet里
    multimap的使用 in C++,同一个关键码存在多个值
    pandas把多个sheet读进一个DataFrame
    数据预处理之Minkowski距离计算
  • 原文地址:https://www.cnblogs.com/pfxiong/p/3657517.html
Copyright © 2011-2022 走看看