`
RepublicW
  • 浏览: 85235 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

学习 asychronize

 
阅读更多

package com.xxx.fortuna.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.log4j.Logger;

/**
 * 更新数据
 * 
 * @author 
 * 
 */
public abstract class UpdateDBQueueBase<T> {

	private static Logger log = Logger.getLogger(UpdateDBQueueBase.class);

	private CopyOnWriteArrayList<LinkedBlockingQueue<T>> updateQueueList = new CopyOnWriteArrayList<LinkedBlockingQueue<T>>();

	private int threadNum = 1;

	private AtomicInteger count = new AtomicInteger(0);

	private class updateDBThread implements Runnable {

		public LinkedBlockingQueue<T> queue;

		public updateDBThread(LinkedBlockingQueue<T> queue) {
			this.queue = queue;
			log.info("添加线程 updateDBThread!");
		}

		@Override
		public void run() {
			while (true) {
				try {
					T update = queue.take();
					update(update);
				} catch (Exception e) {
					log.error("updateDao erro:", e);
				} finally {
					if (!updateQueueList.contains(queue) && queue.size() == 0) {
						log.info("删除线程 updateDBThread!");
						break;
					}
				}
			}
		}
	}

	/**
	 * 按用户ID取模加入队列
	 * 
	 * @param splitId
	 * @param update
	 */
	public void addUpdateQueue(long splitId, T update) {
		initThread();
		int index = Math.abs((int) (splitId % 100 % updateQueueList.size()));
		updateQueueList.get(index).add(update);
	}

	/**
	 * 加入当前队列最少等待的队列
	 * 
	 * @param update
	 */
	public void addUpdateQueueFromMin(T update) {
		initThread();
		int index = 0;
		int min = 0;
		for (int i = 0; i < updateQueueList.size(); i++) {
			if (updateQueueList.get(i).size() < min) {
				min = updateQueueList.get(i).size();
				index = i;
			}
		}
		updateQueueList.get(index).add(update);
	}
	
	/**
	 * 轮询加入处理队列
	 * 
	 * @param update
	 */
	public void addUpdateQueue(T update){
		initThread();
		int index = count.addAndGet(1);
		if(index>=updateQueueList.size()){
			index=0;
			count.set(0);
		}
		updateQueueList.get(index).add(update);
	}

	private void initThread() {
		int num = updateQueueList.size();
		try {
			if (num < threadNum) {
				for (int i = num; i < threadNum; i++) {
					LinkedBlockingQueue<T> queue = new LinkedBlockingQueue<T>();
					updateQueueList.add(queue);
					Thread thread = new Thread(new updateDBThread(queue));
					thread.setName(getThreadName() + "-" + i);
					thread.start();
				}
			} else if (num > threadNum) {
				List<LinkedBlockingQueue<T>> delList = new ArrayList<LinkedBlockingQueue<T>>();
				for (int i = threadNum; i < num; i++) {
					delList.add(updateQueueList.get(i));
				}
				for (LinkedBlockingQueue<T> delQueue : delList) {
					updateQueueList.remove(delQueue);
				}
			}
		} catch (Exception e) {
			log.error("UpdateDBQueueBase initThread ", e);
		}

	}
	
	/**
	 * 线程名
	 * @return
	 */
	public abstract String getThreadName();

	/**
	 * 更新逻辑
	 * 
	 * @param update
	 */
	public abstract void update(T update) throws Exception;

	public int getThreadNum() {
		return threadNum;
	}

	public void setThreadNum(int threadNum) {
		this.threadNum = threadNum;
	}

}








package com.xxx.fortuna.activity;

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import com.happyelements.fortuna.dao.UpdateDBQueueBase;
import com.happyelements.fortuna.mongo.MongoManger;

public class BaiHeDao {

	private static BaiHeDao INSTANCE = null;

	public static BaiHeDao getInstance() {
		if (null == INSTANCE) {
			INSTANCE = new BaiHeDao();
		}
		return INSTANCE;
	}

	private BaiHeDao() {
		userNumUpdate = new UpdateUserNum();
		scoresUpdate = new UpdateScores();
	}

	private UpdateUserNum userNumUpdate;

	public void addUserNumQueue(BaiHeTeamDO update) {
		userNumUpdate.addUpdateQueue(update);
	}

	private class UpdateUserNum extends UpdateDBQueueBase<BaiHeTeamDO> {

		public UpdateUserNum() {
			setThreadNum(1);
		}

		@Override
		public void update(BaiHeTeamDO update) throws Exception {
			Query query = Query.query(Criteria.where("id").is(update.getId()));
			Update numUpdate = new Update();
			numUpdate.inc("userNum", update.getUserNum());
			MongoManger.getInstance().update(query, numUpdate,
					BaiHeTeamDO.class);
		}

		@Override
		public String getThreadName() {
			return "BaiHeDao UpdateUserNum";
		}

	}

	private UpdateScores scoresUpdate;

	public void addScoresQueue(BaiHeTeamDO update) {
		scoresUpdate.addUpdateQueue(update);
	}

	private class UpdateScores extends UpdateDBQueueBase<BaiHeTeamDO> {

		public UpdateScores() {
			setThreadNum(1);
		}

		@Override
		public void update(BaiHeTeamDO update) throws Exception {
			Query query = Query.query(Criteria.where("id").is(update.getId()));
			Update numUpdate = new Update();
			numUpdate.inc("scores", update.getScores());
			MongoManger.getInstance().update(query, numUpdate,
					BaiHeTeamDO.class);
		}

		@Override
		public String getThreadName() {
			return "BaiHeDao UpdateUserNum";
		}

	}
}





package com.xxx.fortuna.logic;

import javapns.Push;
import org.apache.log4j.Logger;

import com.happyelements.fortuna.dao.UpdateDBQueueBase;
import com.happyelements.fortuna.model.NotificationApalePO;

/**
 * 给苹果推送消息的管理器
 * 
 * @author
 */
public class ApaleNotificationMgr {

	private static ApaleNotificationMgr INSTANCE = null;

	public static ApaleNotificationMgr getInstance() {
		if (null == INSTANCE) {
			INSTANCE = new ApaleNotificationMgr();
		}
		return INSTANCE;
	}

	private ApaleNotificationMgr() {
		sendNotificationThread = new SendNotificationThread();
	}

	private SendNotificationThread sendNotificationThread;

	private static Logger log = Logger.getLogger(ApaleNotificationMgr.class);

	public void addPushQueue(NotificationApalePO notification) {
		boolean openApaleNotification = Boolean
				.parseBoolean(GameConfigLogic.INSTANCE
						.getGameConfigValue("isApaleNotification"));
		if (null == notification || notification.getUid() <= 0
				|| !openApaleNotification) {
			return;
		}

		sendNotificationThread.addUpdateQueue(notification.getUid(),
				notification);

	}

	private class SendNotificationThread extends
			UpdateDBQueueBase<NotificationApalePO> {

		@Override
		public String getThreadName() {
			return "SendAppaleNotificationThread";
		}

		@Override
		public void update(NotificationApalePO notification) throws Exception {
			if (!notification.isSend()) {
				log.info(notification.getUid()
						+ " 因发送条件没达到无法发送 Apale  Notification "
						+ notification.getMsg());
				return;
			}

			Push.alert(notification.getMsg(), notification.getpFileName(),
					GameConfigLogic.INSTANCE
							.getGameConfigValue("notification_password"), true,
					notification.getToken());

			log.info(notification.getUid() + " 发送 Apale  Notification 成功 "
					+ notification.getMsg() + " " + notification.getpFileName()
					+ " " + notification.getToken());
		}

	}

}



分享到:
评论

相关推荐

    CALL RFC synchronize and asychronize Examples

    以下是关于"CALL RFC synchronize and asychronize Examples"的详细解释。 **同步调用 (Synchronize Call)** 同步调用是立即执行并等待结果返回的方式。在提供的示例`SAPBC415_RFCSYNC_S1`中,我们看到如何通过`...

    《基于YOLOv8的八段锦练习指导系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    大语言模型教育应用中的知识冲突挑战与应对策略

    内容概要:本文详细探讨了大语言模型(LLMs)在教育应用中遇到的知识冲突问题,包括概念定义、事实陈述和逻辑推理层面的认知不一致性。文章分析了知识冲突的技术成因,如训练数据噪声、参数化知识表示的局限、推理机制的缺陷、模型架构的不足及外部知识的偏差,并探讨了这些因素对教育应用的深远影响。文中提出了多维度的解决路径,如通过数据增强优化知识表示、利用提示强化上下文连贯、开发量规完善模型评估等。此外,文章从社会文化的宏观视角剖析了知识冲突的外部驱动因素,探讨如何在多元异质、动态演进的社会建构语境中构建开放进取、兼容融通的智能教育应用体系。 适合人群:从事教育技术研究的学者、教育工作者、人工智能研究人员和技术开发者。 使用场景及目标:①帮助教育工作者理解大语言模型在教育应用中的局限性;②为技术人员提供优化大语言模型教育应用的具体策略;③促进教育人工智能技术的可靠性、适应性和普及性提升。 其他说明:文章强调了知识冲突的有效化解不仅能够提升大语言模型在教育场景中的应用价值,还将为人工智能在更广泛领域的可持续发展奠定坚实基础。

    《基于YOLOv8的家具鉴定系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    数据结构day1-思维导图顺序表

    数据结构day1-思维导图顺序表

    STM32超声波红外避障小车

    STM32超声波红外避障小车项目通过STM32微控制器实现自动避障功能。硬件部分主要包括STM32开发板、超声波传感器、红外传感器、直流电机、电池模块和电机驱动模块。超声波传感器用于测量前方障碍物的距离,红外传感器帮助小车检测地面线路或障碍物。电机驱动模块通过STM32控制直流电机的转动,从而实现小车的前进、后退和转向。 在软件方面,STM32通过编写简单的避障算法,实时读取传感器数据,并根据环境信息控制小车的运动。当超声波传感器检测到障碍物时,系统会触发后退或转向操作,避免碰撞。

    哈尔滨工业大学DeepSeek公开课-从图灵测试到DeepSeek.pdf

    哈尔滨工业大学DeepSeek公开课-从图灵测试到DeepSeek.pdf

    《基于YOLOv8的冰上运动监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的体育产业监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的港口机械识别系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    oooooomy_vchat_1742859071.zip

    app开发

    《基于YOLOv8的3D打印缺陷检测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    Screenshot_2025-03-31-19-36-01-657_com.UCMobile.jpg

    Screenshot_2025-03-31-19-36-01-657_com.UCMobile.jpg

    半导体过程控制篇 集成电路的可靠性仿真_03_31_153111.docx

    半导体过程控制篇 集成电路的可靠性仿真_03_31_153111.docx

    社交应用_鸿蒙OS_API12_高仿微信APP_开发示例_1742847098.zip

    社交应用_鸿蒙OS_API12_高仿微信APP_开发示例_1742847098.zip

    《基于YOLOv8的民间体育监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    安卓_热更新_简化编译_HTHotFix框架_1742849446.zip

    app开发

    2024 最新版智慧消防全流程解决方案(含 BIM+IoT 技术应用 + 典型案例分析)

    2024 最新版智慧消防全流程解决方案(含 BIM+IoT 技术应用 + 典型案例分析)

    电商_微信小程序_学习项目_电商功能演示_1742849441.zip

    电商_微信小程序_学习项目_电商功能演示_1742849441.zip

    jiguang.zip

    jiguang.zip

Global site tag (gtag.js) - Google Analytics