(Java线程池 三)Java的四种线程池之scheduledThreadPool

本文介绍了Java中ScheduledExecutorService的使用,它用于创建定长线程池,支持定时及周期性任务执行。通过示例代码展示了schedule方法实现延迟执行的定时任务,以及scheduleAtFixedRate方法实现的周期执行任务。相比Timer,ScheduledExecutorService更安全且功能更强大。
摘要由CSDN通过智能技术生成

Java的四种线程池之scheduledThreadPool


一、概念

创建一个定长线程池,支持定时及周期性任务执行。

值得注意的是:创建scheduledThreadPool时,不是使用ExecutorService,而是使用ScheduledExecutorService

定时任务所用方法为:schedule(new Runnable(){}, long delay, TimeUnit unit)

周期任务所用的方法为:scheduleAtFixedRate(new Runnable(){}, long initialDelay, long period, TimeUnit unit)

二、Java代码

/*创建一个定长线程池,支持定时及周期性任务执行。*/
	public static void scheduledThreadPool() {
		//注意创建scheduledThreadPool时,不是使用ExecutorService,而是使用ScheduledExecutorService
		ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
		System.out.println(System.currentTimeMillis());
		//schedule延迟执行方法,定时任务。
		scheduledThreadPool.schedule(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("延迟3秒执行。"+Thread.currentThread().getName());
			}
		}, 3, TimeUnit.SECONDS);
		
		//scheduleAtFixedRate定时执行方法,周期任务
		scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("延迟1秒后,每3秒执行一次。"+Thread.currentThread().getName());
			}
		}, 1, 3,TimeUnit.SECONDS);
		
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("延迟1秒后,每4秒执行一次。"+Thread.currentThread().getName());
			}
		}, 1, 4,TimeUnit.SECONDS);
		
		//10秒后,不再生成新的线程,在工作的线程全部执行完后,再运行下面的操作。
		try {
			Thread.sleep(10000);
			scheduledThreadPool.shutdown();
			System.out.println(System.currentTimeMillis());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

需要引入的包:

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

总结

![在这里插入图片描述](https://img-blog.csdnimg.cn/87396a25886445babc81495635f0545d.png)

从时间戳来看,由63911到73914差不多是10秒的间隔,Thread.sleep(10000)使当前线程沉睡10秒,之后调用线程池的shutdown()方法结束所有线程。

在需要用到定时执行和周期执行时,ScheduledExecutorService比Timer更安全,功能更强大。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值