使用ScheduledThreadPoolExecutor执行定时任务

Posted on 2018-09-28 17:51  浅水鱼潜水  阅读(6355)  评论(0编辑  收藏  举报
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 }

 

Copyright © 2024 浅水鱼潜水
Powered by .NET 9.0 on Kubernetes