博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【代码积累】ScheduledAtFixRate test
阅读量:4099 次
发布时间:2019-05-25

本文共 2364 字,大约阅读时间需要 7 分钟。

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Test {	private ScheduledExecutorService scheduledThreadpool = Executors.newScheduledThreadPool(2);	/*newScheduledThreadPool 的corePoolSize 的值会影响线程池的行为。	 * 如果corePoolSize为1,则线程池只有一个可用线程,此时若分配了两个定时任务,如下,一个延时任务,一个周期任务,	 * 则线程池会使用唯一的线程先执行周期任务,直到周期任务完成,才能空闲出来执行延时任务,此时两种任务之间会有冲突,可能会导致延时	 * 无效。如此例:周期任务每隔1s启动一次执行,每次执行2s,根据预定的时间10s,会启动10次执行,则周期任务会在20s后释放线程,才	 * 执行FinishTask,而FinishTask设置的延时是10s,此时延时失效。	 * 如果corePoolSize为2,则可解决上述问题,两个线程分别执行不同的任务。*/		public void test() {		scheduledThreadpool.schedule(new FinishTask(scheduledThreadpool), 10000, TimeUnit.MILLISECONDS);		scheduledThreadpool.scheduleAtFixedRate(new Task(), 0, 1000, TimeUnit.MILLISECONDS);		/*周期任务执行耗时超过period的情况下,period会失效,此时需要分两种情况讨论:		 * 1、仅有某次执行超时		 * 	          例如正常1s执行一次,有一次执行耗时3s,则会积压3次未执行,threadpool此时会尽量快地执行3次(不重叠,不并发)从而		 *   尽量让后面执行能按照规律进行。换句话说,at fix rate只会尽量保证需要执行的次数,实际上无法保证rate(连续执行几次就会		 *   导致rate改变)。因此在实际使用时,要确保每次执行的耗时不超过period,否则可能导致不可预料的结果;		 * 2、每次执行都超时		 * 		造成这种情况的原因是period指定错误,或者task设计有问题,需要重新调整。如果task每次耗时都超过period,则threadpool		 *   无法通过连续快速执行被压制的任务来满足指定的period,此时设计完全无效。此时的实际周期可能变成task的实际耗时。*/				/*有一个重要的原则,分配给一个ScheduledExecutorService的定时任务数不能超过其 corePoolSize,这样可以保证		 * 每个定时任务都能及时被执行。*/	}}
public class Task implements Runnable{	public static int cnt = 0;		/*在这个task中,模拟两种场景:	 * 1、task执行超过period指定的周期,观察executor的执行情况	 * 2、task产生异常,观察executor对后续执行的处理*/	@Override	public void run() {		// TODO Auto-generated method stub		takeSomeTime();	}	private void takeSomeTime() {		try {			System.out.println("current timestamp="+System.currentTimeMillis()+" ,cnt="+(++cnt));			if( 1 == cnt ) {				//Thread.sleep(3000);				throw new Exception();			}			else {				Thread.sleep(300);			}		} catch ( Exception e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}		private void generateAnException() {			}}
import java.util.concurrent.ExecutorService;public class FinishTask implements Runnable{	private ExecutorService threadpool = null;		public FinishTask(ExecutorService threadpool) {		this.threadpool = threadpool;	}		@Override	public void run() {		System.out.println("finish task triggered!");		// TODO Auto-generated method stub		threadpool.shutdown();		//threadpool.shutdownNow();	}	}
 

转载地址:http://pthii.baihongyu.com/

你可能感兴趣的文章
【golang】序列化例子浅析类属性大小写区别
查看>>
go语言context超时控制代码示例
查看>>
go语言context保存上下文
查看>>
go语言坑之并发访问map
查看>>
谈Go语言中并发Map的使用
查看>>
go合并两个有序列表
查看>>
【go链表排序】常数级空间复杂度、nlogn时间复杂度
查看>>
秒杀系统的艺术【内有库存问题解决方法】
查看>>
go语言错题集(坑)【一】
查看>>
go语言错题集(坑)【二】
查看>>
go语言错题集(坑)【三】
查看>>
go简单协程池实现
查看>>
python装饰器与偏函数
查看>>
图解传说中的HTTP协议
查看>>
go闭包
查看>>
go反射
查看>>
部署超简单的 Golong 分布式 WebSocket 微服务
查看>>
go资料
查看>>
go mod 无法下载依赖问题
查看>>
mysql source插入数据乱码
查看>>