码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA线程池之周期性地执行任务

时间:2017-09-30 21:49:32      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:strong   rup   ges   sof   scheduled   png   time   中断   ima   

本文记录使用ScheduledExecutorService的 scheduleAtFixedRate 方法执行周期性任务的过程。

 

一,正常任务执行

负责执行任务的线程类如下:(一个计算阶乘的任务,计算5以上的阶乘,就会抛出异常)

 1 public class FactorialCalc implements Runnable {
 2 
 3     private Integer number;
 4 
 5     public FactorialCalc(Integer number) {
 6         this.number = number;
 7     }
 8 
 9     public void run() {
10 
11         int result = 1;
12 
13         if (number == 0) {
14             System.out.println("0!=" + "1");
15         }
16 
17         if (number > 5) {
18             System.out.println("exception");
19             throw new IllegalArgumentException(">5");
20         }
21 
22         for(int i = 1; i <= number; i++) {
23             result *= i;
24 
25         }
26         System.out.println(number + "!=" + result);
27     }
28 }

 

测试的Main类如下:

 1 public class MainPeriod {
 2 
 3     public static void main(String[] args) {
 4 
 5         ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
 6 
 7         FactorialCalc task1 = new FactorialCalc(6);
 8         FactorialCalc task2 = new FactorialCalc(3);
 9 
10         ScheduledFuture<?> result = executorService.scheduleAtFixedRate(task1, 0, 1, TimeUnit.SECONDS);
11 //       ScheduledFuture<?> result =  executorService.scheduleAtFixedRate(task2, 0, 2, TimeUnit.SECONDS);
12 
13         try {
14             TimeUnit.SECONDS.sleep(5);
15             executorService.shutdown();
16         } catch (InterruptedException e) {
17             e.printStackTrace();
18         }
19     }
20 }

 

ScheduledFuture<?> result = executorService.scheduleAtFixedRate(task1, 0, 1, TimeUnit.SECONDS);

提交一个Runnable任务,延迟为0,每1秒钟执行一次。

 

二,线程 执行过程中出现异常

当提交 task1 时,线程在执行过程中会抛出异常。

        FactorialCalc task1 = new FactorialCalc(6);//计算6的阶乘,6大于5

        ScheduledFuture<?> result = executorService.scheduleAtFixedRate(task1, 0, 1, TimeUnit.SECONDS);

此时,如果注释掉 //executorService.shutdown(); 则线程池不会中止。但是由于线程执行过程中抛出了异常,任务也不会周期性地执行了。参考JDK里面的scheduleAtFixedRate注释:

 * If any execution of the task
     * encounters an exception, subsequent executions are suppressed.

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                                                  long initialDelay,
                                                  long period,
                                                  TimeUnit unit);

技术分享

 

三,关闭线程池 ,执行 executorService.shutdown() 语句

若线程池线程 执行任务过程中抛出了异常,但是在 主线程中 执行了executorService.shutdown() 语句,则会正常关闭 线程池。

 

四,总结

使用ScheduledExecutorService的 scheduleAtFixedRate 方法执行周期性任务时,如果任务一直正常执行,则任务会按设定的执行周期一直在运行(前提是,主线程内不要调用executorService.shutdown() ,比如需要 执行 永久性的周期性任务,那就不能调用 executorService.shutdown() )。

如果任务在某次执行过程中抛出了异常,则周期性任务会被中断,后续也不会再生成任务了,如果主线程 也没有 调用 executorService.shutdown() ,那线程池就不会关闭了。

 

原文:http://www.cnblogs.com/hapjin/p/7616068.html

JAVA线程池之周期性地执行任务

标签:strong   rup   ges   sof   scheduled   png   time   中断   ima   

原文地址:http://www.cnblogs.com/hapjin/p/7616068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!