当前位置:   article > 正文

定时器(Timer和线程池定时器)_java timer默认多少线程

java timer默认多少线程

定时器是一种控制任务延时调用,或者周期调用的技术

作用:闹钟,定时邮件发送

定时器的实现方式:

方式1:Timer(定时器)

构造器

public Timer()  创建Timer定时器对象

方法

public void schedule(TimerTask task,long delay,long  period) 开启一个定时器,按照计划处理TimerTask任务

  1. public class Test {
  2. public static void main(String[] args) {
  3. // 创建定时器对戏
  4. Timer t=new Timer();
  5. t.schedule(new TimerTask() {//第一个参数为任务对象 ,这里用的是匿名内部类的形式
  6. @Override
  7. public void run() {
  8. System.out.println(Thread.currentThread().getName()+"执行了");
  9. }
  10. }, 2000,3000); //第二个参数是延时时间,第三个参数为周期时间
  11. }
  12. }

Timer定时器的特点和存在的问题

1:Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入

  1. package DomeTimer;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. public class Test2 {
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7. Timer t=new Timer();
  8. t.schedule(new TimerTask() {
  9. @Override
  10. public void run() {
  11. System.out.println(Thread.currentThread().getName()+"被执行A");
  12. try {
  13. Thread.sleep(20000);//上面的线程休眠了,下面的要等,下面的定时器对象设置的时间就不准了
  14. } catch (InterruptedException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. }
  18. }
  19. }, 2000, 3000);
  20. t.schedule(new TimerTask() {
  21. @Override
  22. public void run() {
  23. System.out.println(Thread.currentThread().getName()+"被执行B");
  24. }
  25. }, 2000,3000);
  26. }
  27. }

2:可能因为其中某个任务异常使Timer线程死掉,从而影响后去任务执行

  1. package DomeTimer;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. public class Test3 {
  5. public static void main(String[] args) {
  6. Timer t=new Timer();
  7. t.schedule(new TimerTask() {
  8. @Override
  9. public void run() {
  10. System.out.println(Thread.currentThread().getName()+"我会出现异常");
  11. System.out.println(10/0);//引发异常
  12. }
  13. },1000, 1000);
  14. t.schedule(new TimerTask() {
  15. @Override
  16. public void run() {
  17. System.out.println(Thread.currentThread().getName()+"上面出现异常我根本执行不了");
  18. }
  19. },1000, 1000);
  20. }
  21. }

方式2:ScheduledExecutorService定时器

ScheduleExecutorService是Jdk1.5中引入了并发包,目的是为了弥补Timer的缺陷,ScheduleExecutorService内部为线程池

方法:

public satic ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 得到线程池对象

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimerUnit unit)  周期调度方法

优点

基于线程池,某个任务的执行情况不会影响其它定时任务的执行

  1. package DomeTimer;
  2. import java.util.Date;
  3. import java.util.TimerTask;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.ScheduledThreadPoolExecutor;
  6. import java.util.concurrent.TimeUnit;
  7. public class Test4 {
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. //创建线程池
  11. ScheduledThreadPoolExecutor pool=new ScheduledThreadPoolExecutor(3);
  12. //ScheduledThreadPoolExecutor pool1=(ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(3);
  13. //开始定时任务
  14. pool.scheduleWithFixedDelay(new TimerTask() {
  15. @Override
  16. public void run() {
  17. System.out.println(Thread.currentThread().getName()+"AAA"+new Date());
  18. }
  19. }, 0, 2, TimeUnit.SECONDS);
  20. }
  21. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/495552
推荐阅读
相关标签
  

闽ICP备14008679号