ScheduledTheadPool线程池的使用

ScheduledTheadPool线程池的特点在于可以延迟执行任务,也可以周期性执行任务。

创建线程池

ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(5);//参数为核心线程数,最大线程数无限大

定义一个简单的任务

class Work implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " start time : "+new Date());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "end time : " + new Date());
    }
}

执行任务的几种方法:

1、立即执行某任务

System.out.println("current time : "+new Date());
for (int i = 0; i < 2; i++) {
    scheduled.execute(new Work());//待执行任务
}

输出结果:

current time : Mon Feb 26 11:31:14 CST 2018
pool-1-thread-2 start time : Mon Feb 26 11:31:14 CST 2018
pool-1-thread-1 start time : Mon Feb 26 11:31:14 CST 2018
pool-1-thread-1end time : Mon Feb 26 11:31:19 CST 2018
pool-1-thread-2end time : Mon Feb 26 11:31:19 CST 2018

结果分析:

程序先打印当前时间:'11:31:14',然后进行for循环,添加两个任务进入线程池,添加方式为立即执行,因此任务各自首先打印开始时间为'11:31:14',与最开始的当前时间相同。然后各自休眠5秒,再次打印时间'11:31:19'。

2、延迟执行

System.out.println("current time : "+new Date());
for (int i = 0; i < 2; i++) {
    scheduled.schedule(new Work(), 3, TimeUnit.SECONDS);//待执行任务,延迟时间,延迟时间单位
}

输出结果

current time : Mon Feb 26 11:34:56 CST 2018
pool-1-thread-1 start time : Mon Feb 26 11:34:59 CST 2018
pool-1-thread-2 start time : Mon Feb 26 11:34:59 CST 2018
pool-1-thread-1end time : Mon Feb 26 11:35:04 CST 2018
pool-1-thread-2end time : Mon Feb 26 11:35:04 CST 2018

结果分析:

程序打印当前时间:'11:34:56',然后进行for循环,添加两个任务进线程池,添加方式为延迟执行,延迟时间为3秒。因此两个任务的开始时间均为'11:34:59',然后执行任务需要5秒,最后打印任务完成时间'11:35:04'。

3、延迟且周期性执行(周期时间从线程开始执行计算)

System.out.println("current time : "+new Date());
for (int i = 0; i < 2; i++) {
    scheduled.scheduleAtFixedRate(new Work(), 3, 10, TimeUnit.SECONDS);//待执行时间,延迟时间,执行周期,时间单位
}

输出结果

current time : Mon Feb 26 11:48:51 CST 2018
pool-1-thread-1 start time : Mon Feb 26 11:48:54 CST 2018
pool-1-thread-2 start time : Mon Feb 26 11:48:54 CST 2018
pool-1-thread-1end time : Mon Feb 26 11:48:59 CST 2018
pool-1-thread-2end time : Mon Feb 26 11:48:59 CST 2018
pool-1-thread-1 start time : Mon Feb 26 11:49:04 CST 2018
pool-1-thread-2 start time : Mon Feb 26 11:49:04 CST 2018
pool-1-thread-2end time : Mon Feb 26 11:49:09 CST 2018
pool-1-thread-1end time : Mon Feb 26 11:49:09 CST 2018
pool-1-thread-4 start time : Mon Feb 26 11:49:14 CST 2018
pool-1-thread-3 start time : Mon Feb 26 11:49:14 CST 2018
pool-1-thread-4end time : Mon Feb 26 11:49:19 CST 2018
pool-1-thread-3end time : Mon Feb 26 11:49:19 CST 2018

结果分析:

程序打印当前时间:'11:48:51',然后进行for循环,添加两个任务进线程池,添加方式为延迟且周期性执行,延迟时间为3秒,周期时间为10秒。因此两个任务的第一次开始时间均为'11:48:54',然后执行任务需要5秒,打印第一次任务完成时间'11:48:59'。同时周期时间为任务的开始时间,即从'11:48:54'开始计算,到'11:49:04'开始第二次周期执行,因此第二次打印任务开始时间即为'11:49:04'。以此类推。

如果周期时间小于线程的执行时间,即线程已到第二个执行周期,但第一次任务仍未执行完成,则会进行等待,直到第一次任务完成,然后立即执行第二次任务。

4、延迟且周期性执行(周期时间从线程执行完成计算)

System.out.println("current time : "+new Date());
for (int i = 0; i < 2; i++) {
    scheduled.scheduleWithFixedDelay(new Work(), 3, 10, TimeUnit.SECONDS);//待执行时间,延迟时间,执行周期,时间单位
}

输出结果

current time : Mon Feb 26 12:00:55 CST 2018
pool-1-thread-1 start time : Mon Feb 26 12:00:58 CST 2018
pool-1-thread-2 start time : Mon Feb 26 12:00:58 CST 2018
pool-1-thread-2end time : Mon Feb 26 12:01:03 CST 2018
pool-1-thread-1end time : Mon Feb 26 12:01:03 CST 2018
pool-1-thread-1 start time : Mon Feb 26 12:01:13 CST 2018
pool-1-thread-2 start time : Mon Feb 26 12:01:13 CST 2018
pool-1-thread-2end time : Mon Feb 26 12:01:18 CST 2018
pool-1-thread-1end time : Mon Feb 26 12:01:18 CST 2018

结果分析:

程序打印当前时间:'12:00:55',然后进行for循环,添加两个任务进线程池,添加方式为延迟且周期性执行,延迟时间为3秒,周期时间为10秒。因此两个任务的第一次开始时间均为'12:00:58',然后执行任务需要5秒,打印第一次任务完成时间'12:01:03'。同时周期时间的开始为任务执行完成时间,即从'12:01:03'开始计算,到'12:01:13'开始第二次周期执行,因此第二次打印任务开始时间即为'12:01:13'。以此类推。

 

转载于:https://www.cnblogs.com/yxth/p/8472511.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值