Java定时任务的三种实现方式

秒速五厘米 2022-04-12 10:14 317阅读 0赞

第一种:

  1. package com.timertask.test;
  2. /**
  3. * 三种方式实现java定时任务
  4. * @author li
  5. *
  6. */
  7. public class TimerTask {
  8. static int i = 1;
  9. public static void main(String[] args) {
  10. /**
  11. * 普通thread
  12. * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着,
  13. * 通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:
  14. * @author li
  15. *
  16. */
  17. final long timeInterval = 3000;
  18. Runnable runnable = new Runnable(){
  19. @Override
  20. public void run() {
  21. while(true){
  22. System.out.println(i+"、Hello LingGe!");
  23. i++;
  24. try {
  25. Thread.sleep(timeInterval);
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }
  31. };
  32. Thread thread = new Thread(runnable);
  33. thread.start();
  34. }
  35. }

执行结果:

  1. 1Hello LingGe!
  2. 2Hello LingGe!
  3. 3Hello LingGe!
  4. 4Hello LingGe!
  5. 5Hello LingGe!
  6. 6Hello LingGe!
  7. 7Hello LingGe!
  8. 8Hello LingGe!
  9. 9Hello LingGe!
  10. 10Hello LingGe!
  11. 每三秒执行一次

第二种:

  1. package com.timertask.test;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. /**
  5. * 三种方式实现java定时任务
  6. * @author li
  7. *
  8. */
  9. public class TimerTask2 {
  10. static int i = 1;
  11. public static void main(String[] args) {
  12. /**
  13. *
  14. * 于第一种方式相比,优势 1>当启动和去取消任务时可以控制 2>第一次执行任务时可以指定你想要的delay时间
  15. *
  16. * 在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。 Timer实例可以调度多任务,它是线程安全的。
  17. * 当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。 下面是代码:
  18. *
  19. * @author GT
  20. *
  21. */
  22. final Timer timer = new Timer();
  23. TimerTask task = new TimerTask(){
  24. @Override
  25. public void run() {
  26. System.out.println("Hello LingGe!!");
  27. //退出任务
  28. timer.cancel();
  29. }
  30. };
  31. //延迟指定的时间执行,单位毫秒
  32. long delay = 5000;
  33. long intervalPeriod = 1*3000;
  34. timer.schedule(task, delay);
  35. //timer.scheduleAtFixedRate(task, delay, intervalPeriod);
  36. }
  37. }

第三种:

  1. package com.timertask.test;
  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.ScheduledExecutorService;
  4. import java.util.concurrent.TimeUnit;
  5. /**
  6. * 三种方式实现java定时任务
  7. * @author li
  8. *
  9. */
  10. public class TimerTask3 {
  11. static int i = 1;
  12. public static void main(String[] args) throws InterruptedException {
  13. /**
  14. *
  15. *
  16. * ScheduledExecutorService是从Java SE5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。
  17. * 相比于上两个方法,它有以下好处:
  18. * 1>相比于Timer的单线程,它是通过线程池的方式来执行任务的
  19. * 2>可以很灵活的去设定第一次执行任务delay时间
  20. * 3>提供了良好的约定,以便设定执行的时间间隔
  21. *
  22. * 下面是实现代码,我们通过ScheduledExecutorService#scheduleAtFixedRate展示这个例子,通过代码里参数的控制,首次执行加了delay时间。
  23. *
  24. *
  25. * @author GT
  26. *
  27. */
  28. final long timeInterval = 3000;
  29. Runnable runnable = new Runnable(){
  30. @Override
  31. public void run() {
  32. while(true){
  33. System.out.println(i+"、Hello LingGe!_"+Thread.currentThread().getId());
  34. i++;
  35. try {
  36. Thread.sleep(timeInterval);
  37. } catch (InterruptedException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  42. };
  43. //构造一个线程池(我猜的)
  44. ScheduledExecutorService service = Executors.newScheduledThreadPool(5);
  45. // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
  46. service.scheduleAtFixedRate(runnable, 5, 3, TimeUnit.SECONDS);
  47. service.scheduleAtFixedRate(runnable, 2, 3, TimeUnit.SECONDS);
  48. }
  49. }

结果:

  1. 1Hello LingGe!_9
  2. 2Hello LingGe!_10
  3. 3Hello LingGe!_9
  4. 4Hello LingGe!_10
  5. 5Hello LingGe!_9
  6. 6Hello LingGe!_10
  7. 7Hello LingGe!_9
  8. 8Hello LingGe!_10
  9. 9Hello LingGe!_9
  10. 10Hello LingGe!_10
  11. 11Hello LingGe!_9

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java实现定时任务方法

    在应用里经常都有用到在后台跑定时任务的需求。举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据、文件等。在本文里,我会给大家介绍3种不同的实现方法: