1.如何实现定时任务- Java Timer/TimerTask 源码解析
2.金龙吸水技术指标公式源码
如何实现定时任务- Java Timer/TimerTask 源码解析
日常实现各种服务端系统时,源码我们一定会有一些定时任务的源码需求。比如会议提前半小时自动提醒,源码异步任务定时/周期执行等。源码那么如何去实现这样的源码一个定时任务系统呢? Java JDK提供的Timer类就是一个很好的工具,通过简单的源码256的源码API调用,我们就可以实现定时任务。源码
现在就来看一下java.util.Timer是源码如何实现这样的定时功能的。
首先,源码我们来看一下一个使用demo
基本的源码使用方法:
加入任务的API如下:
可以看到API方法内部都是调用sched方法,其中time参数下一次任务执行时间点,源码是源码通过计算得到。period参数为0的源码话则表示为一次性任务。
那么我们来看一下Timer内部是源码如何实现调度的。
内部结构
先看一下Timer的源码组成部分:
Timer有3个重要的模块,分别是 TimerTask, TaskQueue, TimerThread
那么,在加入任务之后,整个Timer是怎么样运行的呢?可以看下面的示意图:
图中所示是简化的逻辑,多个任务加入到TaskQueue中,会自动排序,队首任务一定是linux最早源码当前执行时间最早的任务。TimerThread会有一个一直执行的循环,从TaskQueue取队首任务,判断当前时间是否已经到了任务执行时间点,如果是则执行任务。
工作线程
流程中加了一些锁,用来避免同时加入TimerTask的并发问题。可以看到sched方法的逻辑比较简单,task赋值之后入队,队列会自动按照nextExecutionTime排序(升序,排序的monorepo 源码构建实现原理后面会提到)。
从mainLoop的源码中可以看出,基本的流程如下所示
当发现是周期任务时,会计算下一次任务执行的时间,这个时候有两种计算方式,即前面API中的
优先队列
当从队列中移除任务,或者是修改任务执行时间之后,队列会自动排序。始终保持执行时间最早的任务在队首。 那么这是如何实现的呢?
看一下TaskQueue的源码就清楚了
可以看到其实TaskQueue内部就是基于数组实现了一个最小堆 (balanced binary heap), 堆中元素根据 执行时间nextExecutionTime排序,执行时间最早的溯源验证源码任务始终会排在堆顶。这样工作线程每次检查的任务就是当前最早需要执行的任务。堆的初始大小为,有简单的倍增扩容机制。
TimerTask 任务有四种状态:
Timer 还提供了cancel和purge方法
常见应用
Java的Timer广泛被用于实现异步任务系统,在一些开源项目中也很常见, 例如消息队列RocketMQ的 延时消息/消费重试 中的异步逻辑。
上面这段代码是RocketMQ的延时消息投递任务 ScheduleMessageService 的核心逻辑,就是使用了Timer实现的异步定时任务。
不管是实现简单的异步逻辑,还是android imageview 源码构建复杂的任务系统,Java的Timer确实是一个方便实用,而且又稳定的工具类。从Timer的实现原理,我们也可以窥见定时系统的一个基础实现:线程循环 + 优先队列。这对于我们自己去设计相关的系统,也会有一定的启发。
金龙吸水技术指标公式源码
金龙吸水技术指标并没有一个广泛认可的标准公式,因为它可能是一种特定于某个交易系统或分析软件的自定义指标。不过,如果我们假设“金龙吸水”是基于某种动量或趋势反转的策略,我可以提供一个模拟的、简化的技术指标公式示例,以及相应的解释。
假设“金龙吸水”指标是基于移动平均线和相对强弱指数结合的一个策略,其目的是为了捕捉价格趋势的反转点。以下是一个简化的伪代码示例:
plaintext
// 金龙吸水技术指标伪代码
// MA为移动平均,RSI为相对强弱指数
// 定义参数
short_MA_period = 5; // 短期移动平均线周期
long_MA_period = ; // 长期移动平均线周期
RSI_period = ; // RSI周期
RSI_overbought = ; // RSI超买阈值
RSI_oversold = ; // RSI超卖阈值
// 计算移动平均线和RSI值
short_MA = MA;
long_MA = MA;
RSI_value = RSI;
// 判断金龙吸水条件
if and then
signal = "金龙吸水买入信号";
else if and then
signal = "金龙吸水卖出信号";
else
signal = "无信号";
在上述伪代码中,我们定义了一个基于短期和长期移动平均线交叉,并结合RSI值来判断买入和卖出信号的简单策略。当短期移动平均线上穿长期移动平均线,且RSI值低于超卖阈值时,发出买入信号;反之,则发出卖出信号。
这种策略背后的逻辑是,移动平均线的交叉可能意味着趋势的反转,而RSI值则用来确认当前价格是否处于超买或超卖状态,从而增加交易信号的可靠性。
需要注意的是,这只是一个示例性的策略,并不构成任何投资建议。实际应用中,交易者可能需要根据市场情况和个人风险承受能力来调整参数和策略逻辑。
最后,强调一点,“金龙吸水”这个名词并不是金融领域的标准术语,可能是某个特定群体或软件中的自定义指标。因此,具体的公式和实现方式可能因人而异。上述提供的只是一个基于常见技术指标构建的模拟示例。在实际应用中,交易者应根据自己的需求和市场分析来制定和调整交易策略。