您当前的位置: 首页 > 
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Timer、ScheduleThreadPool区分

沙漠一只雕得儿得儿 发布时间:2019-03-14 08:53:27 ,浏览量:0

参考鸿阳博客:https://blog.csdn.net/lmj623565791/article/details/27109467

timer是单线程任务,ScheduledExecutorService可以自定定义线程数,是并发执行的:

1、Timer管理延时任务的缺陷

以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗;然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷

2、Timer当任务抛出异常时的缺陷

如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行

3、Timer执行周期任务时依赖系统时间

Timer执行周期任务时依赖系统时间,如果当前系统时间发生变化会出现一些执行上的变化,ScheduledExecutorService基于时间的延迟,不会由于系统时间的改变发生执行变化

timer示例:
public class TimerTest {

    private static long startTime;

    public static void main(String[] args) {

        TimerTask task1 = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task1 invoked ! " + (System.currentTimeMillis() - startTime));
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        TimerTask task2 = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task2 invoked ! " + (System.currentTimeMillis() - startTime));
            }
        };

        startTime = System.currentTimeMillis();

        Timer timer = new Timer();
        timer.schedule(task1, 1000);
        timer.schedule(task2, 3000);

    }
}
ScheduledExecutorService示例:
public class ScheduleThreadPool {

    private static long startTime;

    public static void main(String[] args) {

        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);

        TimerTask task1 = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task1 invoked ! " + (System.currentTimeMillis() - startTime));
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        TimerTask task2 = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task2 invoked ! " + (System.currentTimeMillis() - startTime));
            }
        };

        startTime = System.currentTimeMillis();

        scheduledExecutorService.schedule(task1, 1000, TimeUnit.MILLISECONDS);
        scheduledExecutorService.schedule(task2, 3000, TimeUnit.MILLISECONDS);

    }
}
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0487s