多线程之实现Callable接口

2023-11-13

调用方法:

/**
	 * 点击量/月(年)Callable
	 */
	public void yearlyClickCallable() {
		// 获取参数
		String year = getPara("year");
		// 统计数据集X
		List<String> xList = new ArrayList<String>();
		xList.add("January");
		xList.add("February");
		xList.add("March");
		xList.add("April");
		xList.add("May");
		xList.add("June");
		xList.add("July");
		xList.add("August");
		xList.add("September");
		xList.add("October");
		xList.add("November");
		xList.add("December");
		// 统计数据集Y
		List<Integer> yList = new ArrayList<Integer>();
		// 接收线程值
		List<Future<List<Map<String, Object>>>> futureList = new ArrayList<Future<List<Map<String, Object>>>>();
		// 计数器
		int count = 0;
		// 创建一个线程池(决定开启几个线程)
		ExecutorService pool = Executors.newCachedThreadPool();
		// 每月的日志分析
		for (int m = 1; m <= 12; m++) {
			// 收集日期参数
			List<String> dateList = new ArrayList<String>();
			//
			String date = "";
			// 判断有多少天
			int days = CalendarUtil.weekForMonth(Integer.valueOf(year), m);
			// 组合日期
			for (int i = 1; i <= days; i++) {

				if (i <= 9) {

					if (m <= 9) {
						date = year + "-0" + m + "-0" + i;
					} else {
						date = year + "-" + m + "-0" + i;
					}
				} else {
					if (m <= 9) {
						date = year + "-0" + m + "-" + i;
					} else {
						date = year + "-" + m + "-" + i;
					}
				}
				dateList.add(date);
			}
			// 启动
			Future<List<Map<String, Object>>> future = pool.submit(new ReadLogFileCallableByYear(dateList));

			futureList.add(future);
		}
		// 关闭线程池
		pool.shutdown();
		// 接收结果集
		for (Future<List<Map<String, Object>>> future : futureList) {
			try {
				// 接收参数
				List<Map<String, Object>> list = future.get(1, TimeUnit.SECONDS);

				// 设置参数
				for (int p = 0; p < list.size(); p++) {

					count += (int) list.get(p).get("clickCount");

					if (list.get(p).get("month").equals("01")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("02")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("03")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("04")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("05")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("06")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("07")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("08")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("09")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("10")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("11")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					} else if (list.get(p).get("month").equals("12")) {
						yList.add((Integer) list.get(p).get("clickCount"));
					}

				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		setAttr("totalCount", count);
		setAttr("x", xList);
		setAttr("y", yList);
		renderJson();
	}

多线程方法:

package com.ninemax.util.loganalysis;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

import com.ninemax.util.loganalysis.tool.ConstantUtil;

/**
 * 多线程有返回值
 * 
 * @author Darker
 * 
 */
public class ReadLogFileCallableByYear implements Callable<List<Map<String, Object>>> {
	// 日期数组
	private List<String> clickDate;
	// 返回结果集
	public List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

	public ReadLogFileCallableByYear(List<String> clickDate) {
		this.clickDate = clickDate;
	}

	@Override
	public List<Map<String, Object>> call() throws Exception {
		// 接收参数
		Map<String, Object> map = new HashMap<String, Object>();
		// 利用FileInputStream读取文件信息
		FileInputStream fis = null;
		// 利用InputStreamReader进行转码
		InputStreamReader reader = null;
		// 利用BufferedReader进行缓冲
		BufferedReader bufReader = null;
		// 利用StringBuffer接收文件内容容器
		StringBuffer buf = new StringBuffer();
		// 点击量/月
		int monthClick = 0;

		for (int i = 0; i < clickDate.size(); i++) {
			// 获取文件
			File clickLogFile = new File(ConstantUtil.LOGLOCATION, "article.click."+ clickDate.get(i) + ".txt");
			// 判断文件是否存在
			if (!clickLogFile.exists() || clickLogFile.isDirectory()) {

				System.err.println(clickDate.get(i) + "的文件不存在...");
				
				map.put("month", clickDate.get(i).substring(5, 7));
				map.put("clickCount", 0);
				list.add(map);
				
				return list;
			} else {
				try {
					// 节点流
					fis = new FileInputStream(clickLogFile);
					// 转换流
					reader = new InputStreamReader(fis, "utf-8");
					// 处理流
					bufReader = new BufferedReader(reader);
					// 计数器
					int count = 0;
					// 按行读取
					String line = "";
					// 读取文件
					while ((line = bufReader.readLine()) != null) {
						// 计数
						count++;
						// 接收数据
						if (!line.equals(null) && !line.equals("")) {

							buf.append(line + "\n");
						}
					}
					if (count == 0) {
						count = 0;
					} else {
						count = count - 1;
					}
					monthClick += count;
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					// 关闭流
					try {
						bufReader.close();
						reader.close();
						fis.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
		// 结果集
		map.put("month", clickDate.get(0).substring(5, 7));
		
		if (monthClick == 0) {
			map.put("clickCount", 0);
		} else {
			map.put("clickCount", monthClick);
		}

		list.add(map);

		return list;
	}

}

菜鸟交流群:260052172(大神莫入)

转载于:https://my.oschina.net/Tsher2015/blog/693550

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程之实现Callable接口 的相关文章

  • mysql强制走索引

    在一张表中 仅有千万级别的数据 现在我有一个SQL语句 我该增加的索引都增加了 但是执行速度很慢 我们经过分析执行的SQL语句得到如下 是因为 在查询的时候 使用的索引错误了 也可以强制其走指定的索引 select from table f
  • 【C++心愿便利店】No.5---构造函数和析构函数

    文章目录 前言 一 类的6个默认成员函数 二 构造函数 三 析构函数 前言 个人主页 小沈YO 小编介绍 欢迎来到我的乱七八糟小星球 专栏 C 心愿便利店 本章内容 类和对象 记得 评论 点赞 收藏 关注 哦 提示 以下是本篇文章正文内容
  • 跨年烟花 html 代码汇总

    此篇汇总了一些笔者觉得好玩又可简单实现的烟花代码 多多支持大佬们的创作 烟花代码1 https blog csdn net u013343616 article details 122233674 样例 更改这里的文字可以更改弹出文字 烟花
  • 白盒测试流程图及测试用例设计(软件测试实验报告)

    白盒测试流程图及测试用例设计 1 课程设计目的 1 理解白盒测试原理 2 绘制白盒测试流程图 2 课程设计方法 1 绘制流程图 2 设计测试用例 3 课程设计内容 题目 输入x和y值 首先判断x和y是否为正数 如果是正数 那么计算两者的数值
  • Servlet的会话管理机制

    一 Servlet的会话管理机制 根据设计 HTTP是一种无状态的协议 它意味着Web应用并不了解有关同一用户以前请求的信息 维持会话状态信息的方法之一是使用Servlet 或者JSP容器提供的会话跟踪功能 Servlet API规范定义了
  • angular 使用jwt token验证

    Created by 何欣澄 on 2017 5 28 0028 import Observable from rxjs Observable import Injectable from angular core import Http
  • Springboot项目中如何使用线程池

    目录 1 基于 ExecutorService 自定义线程池 Java 5中引入的 2 基于 ThreadPoolTaskExecutor 线程池的使用 Spring提供 以及监听线程池 3 自定义 ThreadPoolTaskExecut
  • Qt源码在32位arm上编译

    本文参考了 https blog csdn net console log article details 122855717 spm 1001 2014 3001 5506 1 下载qt everywhere src 5 12 11 ta
  • 【百度飞浆AI Studio】2、感性快速体验深度学习的线性归回预测房价

    百度学习原文地址 https www paddlepaddle org cn documentation docs zh 1 5 beginners guide basics fit a line README cn html import
  • 传输速率单位:比特Byte与字节Bit(不跳动)

    BIT Bit是英文中的单数 指1Bit 从2Bits开始后面就加s了 也就是Bit和Bits实际是同一个数量单位 一个是单数 一个是复数 Bit常用缩写是b 那么bps就是Bit per second 也就是指每秒传输多少个字节 也可写为
  • JAVA开发(Redis的主从与集群)

    现在web项目无处不在使用缓存技术 redis的身影可谓无处不在 但是又有多少项目使用到的是redis的集群 大概很多项目只是用到单机版的redis吧 作为缓存的一块 set get数据 用的不亦乐乎 但是对于高可用系统来说 数据集群是很有
  • Golang切片 slice类型

    因为在Golang中 数组的长度是固定的 一旦定义 在后续的操作中就不能更改长度 在某些实际使用场景中就不是那么的的方便 这个时候我们就可以使用切片 slice 类型 1 slice基本定义 Golang 的 slice 是一个引用类型 内
  • 西门子冗余服务器 系统拷贝,西门子(SIEMENS)冗余系统指南.pdf

    西门子冗余系统指南 Siemens redundancy system introduction 使用入门 Edition 2008 年 1 月 摘 要 本文主要介绍了 SIMATIC H 系统的基本组成 S7 400H 硬件冗余原理 S7
  • IDEA中设置网络代理

    需求 在IDEA中使用Database插件连接数据库时提示我需要安装插件依赖的数据库驱动 大家注意不要把这个数据库驱动和你的项目pom文件中导入的数据库驱动搞混了 不是一回事 选择下载后会自动去maven中央仓库下载 下载很慢很慢 而且好几
  • 使用GSM和Arduino作为GPS的替代品

    在本篇文章中 您将学习到如何通过GSM模块和Arduino而不是使用GPS创建导航系统 在本篇文章结束时 您将可以 解有关GSM模块以及如何将其与Arduino一起使用的更多信息 通过GSM模块制作导航系统 关于导航 在导航系统中 无线站定
  • ios mysql管理_App版本管理-iOS版本 - 数据库设计 - 数据库表结构 - 果创云

    数据库大全 App版本管理 iOS版本 来源 YesApi cn CREATE TABLE yesapi appver ios version id bigint 20 unsigned NOT NULL AUTO INCREMENT ap
  • 必看![文心一言] 中国版ChatGPT“狂飙,傲视诛仙

    最近 有一个叫作ChatGPT的技术产品在社交媒体上引起了热议 这是一种基于人工智能的聊天机器人 能够像人类一样进行对话 目前 它在国外的应用已经非常广泛 而中国地区也在迅速跟进 现在 中国版的文心一言来了 这是一款由百度开发的AI 采用了
  • Flutter 图片加载

    奇技指南 本篇文章你将获得 1 Flutter 图片加载方式 2 Flutter 图片加载源码实现流程 3 Flutter 图片加载优化点有什么 本文转载自奇舞移动技术 Flutter Image 在 Flutter 中 Image 是展示
  • 【PTA】整除光棍

    一 题目 光棍 说的是全部由1组成的数字 比如1 11 111 1111等 传说任何一个光棍都能被一个不以5结尾的奇数整除 比如 111111就可以被13整除 现在 你的程序要读入一个整数x 这个整数一定是奇数并且不以5结尾 然后 经过计算
  • linux中/etc/inittab文件分析

    一 什么是init init是Linux系统操作中不可缺少的程序之一 是一个由内核启动的用户级进程 内核启动 已经被载入内存 开始运行 并已初始化所有的设备驱动程序和数据结构等 之后 就通过启动一个用户级程序init的方式来启动其他用户级的

随机推荐

  • Java中float、double、long类型变量赋值添加f、d、L尾缀问题

    1 添加尾缀说明 我们知道Java在变量赋值的时候 其中float double long数据类型变量 需要在赋值直接量后面分别添加f或F d或D l或L尾缀来说明 其中 long类型最好以大写L来添加尾缀 因为小写l容易和数字1混淆 例如
  • 三分钟了解APS系统中生产计划排程模块的基本原理

    版权声明 本文为CSDN博主 weixin 45414340 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net weixin 45414340 article
  • 【吴恩达-AIGC/ChatGPT提示工程课程】第九章 - 总结

    吴恩达 AIGC ChatGPT提示工程课程 第九章 总结 恭喜你完成了这门短期课程 总的来说 在这门课程中 我们学习了关于prompt的两个关键原则 编写清晰具体的指令 如果适当的话 给模型一些思考时间 你还学习了迭代式prompt开发的
  • python实现简单爬虫和数据可视化-爬取豆瓣top250电影信息

    此内容全程跟着成都工业大学的李巍老师爬虫入门视频敲的代码 如有侵权删 观看的视频链接如下 李巍老师爬虫入门视频 整个爬虫可分为三个部分 1 爬取网页 https movie douban com top250 start 0 2 解析数据
  • feign超时时间设置_Spring Cloud 项目各种超时时间设置详解

    1 本文主要内容 服务之间调用Hystrix针对单个方法超时时间设置 Spring Cloud Gateway 针对单独URL的超时时间设置 2 超时时间设置场景 通常整个系统会有统一的接口超时时间设定 一般情况下的增删改查也都会比较快 但
  • 面试经验分享

    核心 几个大块的内容 前期准备 简历 自信 实力 态度 语言表达 1 简历制作 简历要有特点 将博客 GitHub 自己的作品链接 还有电子版本的简历链接直接写上去 很重要 特长描述 工作经历 岗位职责 技能描述 项目经历描述 每一个项目都
  • Altium Designer中的电路仿真

    今天看了下Altium Designer的电路仿真功能 发现它还是蛮强大的 按着help里面的文档 TU0106 Defining running Circuit Simulation analyses PDF 跑了一下 觉得还行 所以就把
  • 【满分】【华为OD机试真题2023 JAVA&JS】寻找符合要求的最长子串

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 寻找符合要求的最长子串 知识点双指针 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个字符串 s 找出这样一个子串 1 该子串中的任意一个字符最多出现2次
  • Type-C协议简介(CC检测原理)

    Type C协议简介 CC检测原理 作者 AirCity 2019 12 15 Aircity007 sina com 本文所有权归作者Aircity所有 1 简介 越来越多的手机开始采用Type C作为充电和通信端口 Type C连接器实
  • mesa源码阅读笔记(7)_顶点变换流程解析

    mesa源码阅读笔记 7 顶点变换流程解析 好久没有写博客 同时也放下对mesa源码的阅读很久了 这一篇会是我最后的一篇 有不尽到之处也会放下了 毕竟OpenGL不是我的强项 后面可能没有这么多时间来关注了 这篇文章有点长 而我也不知道自己
  • 毕设-解决移动端用HTTP协议从onenet平台上获取数据流的多个数据点的问题

    onenet平台 OneNET是由中国移动打造的PaaS物联网开放平台 平台能够帮助开发者轻松实现设备接入与设备连接 快速完成产品开发部署 为智能硬件 智能家居产品提供完善的物联网解决方案 产品信息 至于怎么创建产品我就不做过多的介绍了 我
  • 最大公约数和最小公倍数(详解有实例)C语言

    最大公约数这里我运用了辗转相除法来实现 辗转相除法的意思是给出所要求的两个数之后 用大数取余小数 如果为0 那么那个小数就是最大公约数 如果不为1 我再用较大的数取余上个余数 依次循环 最后得到结果 给大家举个例子吧 12和16 首先用16
  • 云原生之使用minikube快速部署本地k8s集群

    云原生之使用minikube快速部署本地k8s集群 一 minikube 介绍 1 minikube简介 2 minikube特点 3 minikube的基本架构 二 本次实践介绍 1 本次实践目的 2 部署环境要求 3 本地环境规划 三
  • 视频流截取保存到本地路径(打包jar包CMD运行)

    需求 现在有一批https的监控视频流URL 需要以多线程模式监听视频流 对视频流进行每三秒截屏一次 将截取的图片post请求发送 根据响应判断图片是否保存到本地 保存时以当前时间命名 代码 BufferedImage类 import or
  • 匿名内部类在开发中的真实使用场景演示

    package Java project 1 import javax swing import java awt event ActionEvent import java awt event ActionListener public
  • linux开启使用ftp

    一 检查系统是否安装vsftpd rpm qa grep vsftpd 这里是安装好了 才会出现版本信息 没有安装不会出现 如果想删除卸载vsftpd使用 rpm qa grep vsftpd 查询出来版本好 通过 rpm e vsftpd
  • libuv使用总结

    libuv是单线程的 依靠uv run轮训当前线程关心的事件IO 所以这些函数的回调里尽量不要有阻塞的函数 否则回调之间相互影响 导致另外的回调走不到 libuv如果使用不当 会造成coredump 多线程用多线程的接口 单线程用单线程的接
  • jemalloc原理分析

    jemalloc原理分析 转载自http club alibabatech org article detail htm articleId 36 首先介绍一下jemalloc中的几个核心概念 1 arena jemalloc的核心分配管理
  • Android中应用程序清除data/data,清除缓存,兼容8.0系统

    前言 最近实现了一款系统级应用中心 需要获取已安装APP的缓存大小以及清除缓存 获取缓存的在另外一篇博客总结过 获取APP缓存大小 因此这篇文章记录一下如何清除缓存 一 安卓8 0之前 1 首先需要自己创建几个AIDL文件 方法在前言连接里
  • 多线程之实现Callable接口

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 调用方法 点击量 月 年 Callable public void yearlyClickCallable 获取参数 String year getPara year 统计