`
xinglijun1973
  • 浏览: 54948 次
社区版块
存档分类
最新评论

一个简单的单节点内存队列

 
阅读更多
package hg.hjf.app.service.rule;

import hg.hjf.app.service.UserRuleService;
import hgtech.jfaccount.JfFlow;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 活动奖励精灵。接受流水并在后台计算
 * @author Administrator
 *
 */
@Component
public class CalDaemon {
	@Autowired
	JfRuleService jfRuleService;
	
	@Autowired
	UserRuleService userRuleService;
	
	public static Log log = LogFactory.getLog(CalDaemon.class);
	private  List<JfFlow> todoFlows= Collections.synchronizedList( new LinkedList <JfFlow>());
	private  List<JfFlow> doneFlows=  (new LinkedList <JfFlow>());
	
	//构造时候,启动一个计算线程。监视待积分队列并计算
	public CalDaemon(){
		 todoFlows= Collections.synchronizedList( new LinkedList <JfFlow>());
		 doneFlows=  (new LinkedList <JfFlow>());
		
		new Thread(){
			public void run() {
				{
					int i=0;
					while(true){
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}						
						i++;
						synchronized (todoFlows)
						{
							//log 
							if(i==10 )
							{	
								if( todoFlows.size()>0){
									log.warn("calDaemon 待积分大小:"+todoFlows.size());
								}
								i=0;
							}
							
							//计算并标记
							long currentTimeMillis = System.currentTimeMillis();
							for(JfFlow f:todoFlows){
								//到时间再计算
								if(currentTimeMillis >= f.toCalTimeAt){
									try {
										jfRuleService.jfRuleByFlow(f);
									} catch (Exception e) {
										log.error("=================流水号"+f.getFlowId().getS()+"的奖励积分计算失败,下面是错误日志:");
										log.error(e,e);
									}
									doneFlows.add(f);
								}
							}
	//					计算过的从队列移除
							if(doneFlows.size()>0){
								todoFlows.removeAll(doneFlows);
								log.warn("calDaemon 已计算大小"+doneFlows.size());
								doneFlows.clear();
							}
						}
						

					}
				}
			}
		}.start();
	}

	public List<JfFlow> getTodoFlows() {
		return todoFlows;
	}

	public void setTodoFlows(List<JfFlow> todoFlows) {
		this.todoFlows = todoFlows;
	}
	
}

 

分享到:
评论

相关推荐

    linux 一个简单队列实例

    在这个“Linux一个简单队列实例”中,我们将探讨如何在Linux环境下实现一个基础的队列,并涵盖入队(enqueue)和出队(dequeue)这两个基本操作。 一、队列数据结构基础 队列的基本结构通常包括头部(front)和尾部...

    简单的数据结构单链队列的VC实现

    指针域,指向下一个节点。链队列的头节点不存储实际数据,而是指示队列的起始位置,而尾节点则指向队列的末尾。 在VC6.0环境下,我们可以使用C++来实现单链队列。首先,定义一个节点结构体: ```cpp struct Node {...

    C++数据结构实验_实现共享栈,链栈,循环队列,链队列

    链队列是基于链表实现的队列,与链栈类似,每个元素也是一个节点,包含数据域和指针域。与循环队列不同,链队列的队头和队尾不存储额外信息,而是通过指向队首元素和队尾元素的指针来表示。链队列的插入和删除操作...

    带头节点和不带头节点的列表

    在插入或删除链表的第一个元素时,由于头节点的存在,操作变得简单,无需考虑链表头部特殊情况。此外,头节点还可以用作临时存储,例如在交换链表元素时,可以先将一个元素的信息暂存到头节点,然后再更新其他节点的...

    队列实现方式

    3. 入队:向链表队列中添加元素时,创建一个新的节点,将数据存入该节点,然后将该节点连接到尾节点之后。更新尾节点为新添加的节点。 4. 出队:从链表队列中删除元素时,只需要更改头节点的指向,使其指向下一个...

    队列的基本操作

    根据给定的部分内容,我们可以看到一个简单的链式队列实现: ```cpp #include using namespace std; // 定义节点结构体 struct Node { int data; Node* next; }; // 入队操作 void En(Node*& end, int a) { ...

    c\c++链式队列 源代码

    以下是一个简单的C++链式队列实现示例: ```cpp #include struct Node { int data; Node* next; }; class Queue { private: Node* front; Node* rear; public: Queue() : front(nullptr), rear(nullptr) {...

    node-queue:简单节点redis队列

    标题"node-queue:简单节点redis队列"表明这是一个用于Node.js的Redis队列库,旨在简化在Node.js应用中使用Redis作为队列后端的过程。通过这个库,开发者可以方便地创建生产者(Producer)来添加任务到队列,以及创建...

    数据结构 队列实现 数据结构 队列实现

    最后,我们通过一个简单的示例来看看如何使用这个队列: ```c int main() { struct queueLK q; int a[8] = {3, 8, 5, 17, 9, 30, 15, 22}; int i; initQueue(&q); for (i = 0; i ; i++) { enQueue(&q, a[i]); ...

    C语言中队列的链式表示和实现,链队列

    以下是一个简单的C语言实现链队列的示例: ```c #include #include // 定义链队列节点 typedef struct Node { int data; struct Node* next; } Node; // 队列结构体 typedef struct Queue { Node* front; ...

    约瑟夫环的队列和循环链表实现

    报数过程中,每报到特定数字,就更新当前节点的下一个节点为当前节点的下一个节点的下一个节点,这样可以连续移除节点,直到链表只剩下一个节点,这个节点即为幸存者。 在给定的文件`YueSeFu.cpp`和`YueSeFu2.cpp`...

    队列的程序

    这个程序展示了如何利用链表数据结构实现一个简单的队列,并提供了基本操作的示例,对于理解和学习队列的实现原理非常有帮助。通过这个程序,我们可以了解队列的基本操作逻辑,以及如何在C语言中使用链表来动态管理...

    只有尾结点的链表表示的队列算法

    最后,给出一个简单的主函数示例,用于演示如何使用上述定义的队列: ```c void main() { LinkQueue Q; int i, e, n, flag; IninitQueue(Q); //初始化队列 printf("请输入队列的长度:"); scanf("%d", &n); if...

    zy_显示链队列元素_

    链队列是由一系列节点组成的线性结构,每个节点包含一个数据域和一个指针域。数据域用于存储元素值,而指针域指向下一个节点。链队列有两个关键的操作:入队(enqueue)和出队(dequeue)。入队是在队尾添加新元素,...

    栈和队列的一个应用

    本文将详细介绍如何利用数据结构中的栈和队列来实现一个简单的停车场管理系统。该系统能够有效地管理停车场内的车辆进出情况,并通过栈和队列模拟实际场景:当停车场(栈)已满时,新到达的车辆可以暂时停放在停车场...

    链式队列的算法c代码

    该函数首先分配内存空间创建一个空节点作为头节点,并将头指针和尾指针都指向这个空节点,同时设置头节点的 `next` 指针为空,表示队列当前为空。 #### 四、链式队列的操作实现 1. **入队操作** 入队操作是在...

    C只有尾指针的循环队列(数据结构作业)

    此外,主函数 `main` 中还包含了一个简单的菜单界面,用于演示上述队列操作。 #### 代码细节分析 - **初始化**: ```c SqQueue rear = NULL; rear = QueueInit(rear); ``` - **插入操作**: ```c scanf_s("%d...

    一个用堆实现的优先级队列

    `empty` 通常是一个简单的检查堆大小是否为零的操作;而 `top` 则是返回堆顶元素但不删除它。 在堆的实现中,通常会使用数组来存储元素,因为数组的索引特性使得访问和交换元素变得非常高效。在插入和删除操作中,...

    数据结构中的节点

    1. **线性数据结构中的节点**:线性数据结构如数组、链表和队列等,节点通常简单地包含一个数据元素和可能的一个指向下一个节点的指针。例如,在单链表中,每个节点包含一个数据域和一个指向下一个节点的链接;而在...

    用链栈实现链队列逆置(栈的指针的实现的应用)

    5. **程序菜单**:最后,程序提供了一个简单的菜单界面,允许用户选择不同的操作,如初始化队列、插入元素、删除元素、显示队列内容以及逆置队列等。 #### 总结 通过对上述代码的分析,我们不仅了解了链队列的基本...

Global site tag (gtag.js) - Google Analytics