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 }
