使用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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM