并发编程:执行器:6、周期性地运行任务(ScheduledThreadPoolExecutor)

本文深入探讨了Java中ScheduledExecutorService的使用,详细解释了scheduleAtFixedRate和scheduleWithFixedDelay两个方法的区别。通过实例演示了如何创建周期性执行的任务,并分析了任务执行的时机和频率。

目录

scheduledExecutorService.scheduleAtFixedRate

scheduledExecutorService.scheduleWithFixedDelay

一、主程序

二、任务

三、执行结果


scheduledExecutorService.scheduleAtFixedRate

在task开始运行时,等待2秒,执行task(这样,如果task运行时间超过2秒的话,就会由N个任务重复运行)(参数1 是延迟1秒开始执行)

ScheduledFuture<?> result = scheduledThreadPool.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);

scheduledExecutorService.scheduleWithFixedDelay

在task结束运行后,等待2秒,再次执行task(这样,保证每次只有一个task在运行)(参数1 是延迟1秒开始执行)

ScheduledFuture<?> result = scheduledThreadPool.scheduleWithFixedDelay(task, 1, 2, TimeUnit.SECONDS);

一、主程序

package xyz.jangle.thread.test.n4_7.schedulefixed;

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * 4.7、scheduleAtFixedRate() 在执行器内周期性地运行任务
 * 
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月22日 下午6:42:45
 * 
 */
public class M {

	public static void main(String[] args) {
		ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
		/*
		ScheduledThreadPoolExecutor p = (ScheduledThreadPoolExecutor) scheduledThreadPool;
		// 如果设置策略,在shutdown之后,继续执行周期性任务,则线程不会因为shutdown()方法的调用而停止。
		p.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
		*/
		System.out.println("Main:开始运行..." + new Date());
		var task = new Task("Task");
		// 在task开始运行时,等待2秒,执行task(这样,如果task运行时间超过2秒的话,就会由N个任务重复运行)
		ScheduledFuture<?> result = scheduledThreadPool.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
		// 在task结束运行后,等待2秒,再次执行task(这样,保证每次只有一个task在运行)
//		ScheduledFuture<?> result = scheduledThreadPool.scheduleWithFixedDelay(task, 1, 2, TimeUnit.SECONDS);
		for (int i = 0; i < 10; i++) {
			System.out.println("Main:Delay " + result.getDelay(TimeUnit.MILLISECONDS));
			try {
				TimeUnit.MILLISECONDS.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("是否完成:"+result.isDone());
		System.out.println("是否取消"+result.isCancelled());
		// 默认情况下,shutdown会结束周期性任务(除非进行策略设置)
		scheduledThreadPool.shutdown();
		System.out.println("是否完成:"+result.isDone());
		System.out.println("是否取消"+result.isCancelled());
		try {
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Main:结束运行..."+new Date());

	}

}

二、任务

package xyz.jangle.thread.test.n4_7.schedulefixed;

import java.util.Date;

/**
 * 	普通的任务
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月22日 下午6:43:52
 * 
 */
public class Task implements Runnable {

	private final String name;

	public Task(String name) {
		super();
		this.name = name;
	}

	@Override
	public void run() {
		System.out.println(this.name + "正在执行" + new Date());
	}

}

三、执行结果

Main:开始运行...Sat Aug 22 19:21:27 CST 2020
Main:Delay 998
Main:Delay 497
Main:Delay -3
Task正在执行Sat Aug 22 19:21:28 CST 2020
Main:Delay 1496
Main:Delay 996
Main:Delay 496
Task正在执行Sat Aug 22 19:21:30 CST 2020
Main:Delay 1995
Main:Delay 1495
Main:Delay 994
Main:Delay 493
Task正在执行Sat Aug 22 19:21:32 CST 2020
是否完成:false
是否取消false
是否完成:true
是否取消true
Main:结束运行...Sat Aug 22 19:21:37 CST 2020

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值