使用ScheduledThreadPoolExecutor执行定时任务

Posted fpqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ScheduledThreadPoolExecutor执行定时任务相关的知识,希望对你有一定的参考价值。

ScheduledThreadPoolExecutor  scheduled = new ScheduledThreadPoolExecutor(2);
        scheduled.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("time:");
            }
        }, 0, 40, TimeUnit.MILLISECONDS);//0表示首次执行任务的延迟时间,40表示每次执行任务的间隔时间,TimeUnit.MILLISECONDS执行的时间间隔数值单位

间隔单位毫秒:TimeUnit.MILLISECONDS 
间隔单位秒:TimeUnit.SECONDS 
间隔单位分钟:TimeUnit.MINUTES 
间隔单位小时:TimeUnit.HOURS 
间隔单位天:TimeUnit.DAYS

其中Runnable里面可以通过一个类实现Runnable接口,具体见

使用ThreadPoolExecutor进行多线程编程

一旦程序启动将无限制执行下去,实际中可以通过限制定时任务的次数或者时间来终止程序的执行。

1,限制程序执行的时间:scheduled.awaitTermination(100,TimeUnit.SECONDS); 这句话表明100毫秒后程序终止。

2,限制程序执行的次数:如果是单线程,那么可以直接定义一个静态变量count,每执行一次,count加一,如果count大于某个值就调用shutdown或者shutdownNow函数;如果是多线程,稍微要复杂一点,但是原理也是一样的。定义一个静态变量count,没执行一个也是count加一,只不过在执行加一操作之前需要加锁,执行完之后需要解锁。

 1 public class ScheduledMultiThreadTool {
 2     private  static Integer count =1;
 3     MyTimereTask myTimereTask = new MyTimereTask();
 4     private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 5     ScheduledExecutorService scheduled =Executors.newScheduledThreadPool(2);
 6 
 7     public void start(){
 8         try {
 9             scheduled.scheduleWithFixedDelay(myTimereTask, 0,1, TimeUnit.SECONDS);
10             scheduled.scheduleWithFixedDelay(myTimereTask, 0,1, TimeUnit.SECONDS);
11             scheduled.scheduleWithFixedDelay(myTimereTask, 0,1, TimeUnit.SECONDS);
12             scheduled.scheduleWithFixedDelay(myTimereTask, 0,1, TimeUnit.SECONDS);
13             while (!scheduled.isTerminated()){
14                 lock.readLock().lock();
15                 if (count >20){
16                     scheduled.shutdown();
17                 }
18                 lock.readLock().unlock();
19 
20             }
21         }catch(Exception e){
22             e.printStackTrace();
23         }
24         System.out.println("Finished all threads");
25     }
26     private class MyTimereTask implements Runnable {
27         @Override
28         public void run(){
29             lock.writeLock().lock();
30             System.out.println("第 "+count+ " 次执行任务,count="+count);
31             count ++;
32             lock.writeLock().unlock();
33         }
34 
35     }
36 }

 





以上是关于使用ScheduledThreadPoolExecutor执行定时任务的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)