Part One: 一个线程处理

if (CollectionUtils.isNotEmpty(cqcAttachmentDataList)) {

long startTimes = System.currentTimeMillis();

final CountDownLatch latchOnlyOne = new CountDownLatch(1);

new Thread(new CqcAttachmentDataWorker(latchOnlyOne,"车前程附件数据处理-线程-only", cqcAttachmentDataList)).start();

try {

latchOnlyOne.await();

long endTimes = System.currentTimeMillis();

logger.info("所有线程(1个线程)执行完毕:" + ((endTimes - startTimes)/1000) + "秒");

} catch (InterruptedException e) {

logger.error("线程(1个线程)处理异常::::",e);

}

}

//数据处理线程worker

public class CqcAttachmentDataWorker implements Runnable{

List<TCdCqcAttachmentData> cqcAttachmentDataSubList = null;

String name = "";

CountDownLatch latch;

public CqcAttachmentDataWorker(CountDownLatch latch,String name, List<TCdCqcAttachmentData> cqcAttachmentDataListTemp){

this.name = name;

this.latch = latch;

this.cqcAttachmentDataSubList = cqcAttachmentDataListTemp;

}

@Override

public void run() {

logger.info(name + "正在执行...");

try {

//2.遍历处理

if (CollectionUtils.isNotEmpty(cqcAttachmentDataSubList)) {

//do it

}

} catch (Exception e) {

logger.error("车前程-数据处理run异常::::", e);

} finally {

latch.countDown();

}

}

}

Part Two: 多线程数据处理1-初级

List<TCdCqcAttachmentData> cqcAttachmentDataList = tCdCqcAttachmentDataService.findTCdCqcAttachmentDataAllList();

if (CollectionUtils.isNotEmpty(cqcAttachmentDataList)) {

long startTimes = System.currentTimeMillis();

int threadCount = cqcWorkerThreadCount;

int total = cqcAttachmentDataList.size();

if (total < threadCount) {

final CountDownLatch latchOnlyOne = new CountDownLatch(1);

new Thread(new CqcAttachmentDataWorker(latchOnlyOne,"车前程附件数据处理-线程-only", cqcAttachmentDataList)).start();

try {

latchOnlyOne.await();

long endTimes = System.currentTimeMillis();

logger.info("所有线程(1个线程)执行完毕:" + ((endTimes - startTimes)/1000) + "秒");

} catch (InterruptedException e) {

logger.error("线程(1个线程)处理异常::::",e);

}

} else {

int every = total / threadCount;

final CountDownLatch latch = new CountDownLatch(threadCount);

List<TCdCqcAttachmentData> cqcAttachmentDataSubList = null;

int divideRemainNumber = total % every; //取模后的余数

int divideRemainNumberTmep = total % threadCount; //取模后的余数

for (int i = 1; i <= threadCount; i++) {

int startIndex = (i - 1) * every;

int endIndex = startIndex + every;

if (total >= endIndex) {

if(divideRemainNumber > 0){

if (i == threadCount)

{

cqcAttachmentDataSubList = cqcAttachmentDataList.subList(startIndex, total);

} else {

cqcAttachmentDataSubList = cqcAttachmentDataList.subList(startIndex, startIndex + every);

}

} else {

if (divideRemainNumberTmep > 0) {

if (i == threadCount)

{

cqcAttachmentDataSubList = cqcAttachmentDataList.subList(startIndex, total);

} else {

cqcAttachmentDataSubList = cqcAttachmentDataList.subList(startIndex, startIndex + every);

}

} else {

cqcAttachmentDataSubList = cqcAttachmentDataList.subList(startIndex, startIndex + every);

}

}

}

new Thread(new CqcAttachmentDataWorker(latch,"车前程附件数据处理-线程" + i, cqcAttachmentDataSubList)).start();

}

try {

latch.await();

long endTimes = System.currentTimeMillis();

logger.info("所有线程执行完毕:" + ((endTimes - startTimes)/1000) + "秒");

} catch (InterruptedException e) {

logger.error("线程处理异常::::",e);

}

}

}

//数据处理线程worker

public class CqcAttachmentDataWorker implements Runnable{

List<TCdCqcAttachmentData> cqcAttachmentDataSubList = null;

String name = "";

CountDownLatch latch;

public CqcAttachmentDataWorker(CountDownLatch latch,String name, List<TCdCqcAttachmentData> cqcAttachmentDataListTemp){

this.name = name;

this.latch = latch;

this.cqcAttachmentDataSubList = cqcAttachmentDataListTemp;

}

@Override

public void run() {

logger.info(name + "正在执行...");

//2.遍历处理

if (CollectionUtils.isNotEmpty(cqcAttachmentDataSubList)) {

}

latch.countDown();

}

}

Part Three: 多线程数据处理2-高级-线程池实现

代码实现:

// 多线程处理

private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 1, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(50000), new ThreadPoolExecutor.CallerRunsPolicy());

if (CollectionUtils.isNotEmpty(ycAndyzTCdBusiExtendlist)) {

LinkedBlockingQueue<TCdBusiExtend> queue = new LinkedBlockingQueue<TCdBusiExtend>();

queue.addAll(ycAndyzTCdBusiExtendlist);

int size = queue.size();

CountDownLatch countDownLatch = new CountDownLatch(size);

for (int i = 0; i < size; i++) {

threadPool.execute(new CqcAttachmentDataHandler(queue, countDownLatch, cqcHandlerServiceFactory, cqcAttachmentDomain, cqcAttachmentFolder));

}

countDownLatch.await();

long poolEndTimes = System.currentTimeMillis();

logger.info("线程池对目标数据处理执行完毕:" + ((poolEndTimes - targetBeginTimes)/1000) + "秒");

long endTimes = System.currentTimeMillis();

logger.info("全部执行完毕:" + ((endTimes - startTimes)/1000) + "秒");

}

worker:

public class CqcAttachmentDataHandler implements Runnable {

private static final AppLogger logger = new AppLogger(CqcAttachmentDataHandler.class);

private LinkedBlockingQueue<TCdBusiExtend> queue;

private CountDownLatch countDownLatch;

private String cqcAttachmentDomain;

private String cqcAttachmentFolder;

private CqcHandlerServiceFactory cqcHandlerServiceFactory;

public CqcAttachmentDataHandler(LinkedBlockingQueue<TCdBusiExtend> queue, CountDownLatch countDownLatch,CqcHandlerServiceFactory cqcHandlerServiceFactoryTemp, String cqcAttachmentDomainTemp, String cqcAttachmentFolderTemp) {

this.queue = queue;

this.countDownLatch = countDownLatch;

this.cqcHandlerServiceFactory=cqcHandlerServiceFactoryTemp;

this.cqcAttachmentDomain = cqcAttachmentDomainTemp;

this.cqcAttachmentFolder = cqcAttachmentFolderTemp;

}

@Override

public void run() {

try {

TCdBusiExtend tCdBusiExtend = queue.poll();

if(tCdBusiExtend != null) {

//do it

}

} catch (Exception e) {

logger.error("CqcAttachmentDataHandler.run error", e);

} finally {

countDownLatch.countDown();

}

}

}

工厂模式:

@Service

public class CqcHandlerServiceFactory {

@Resource

private ITCdCqcAttachmentDataService tCdCqcAttachmentDataService;

@Autowired

private TCdBusiExtendMapper tCdBusiExtendMapper;

public ITCdCqcAttachmentDataService gettCdCqcAttachmentDataService() {

return tCdCqcAttachmentDataService;

}

public void settCdCqcAttachmentDataService(ITCdCqcAttachmentDataService tCdCqcAttachmentDataService) {

this.tCdCqcAttachmentDataService = tCdCqcAttachmentDataService;

}

public TCdBusiExtendMapper gettCdBusiExtendMapper() {

return tCdBusiExtendMapper;

}

public void settCdBusiExtendMapper(TCdBusiExtendMapper tCdBusiExtendMapper) {

this.tCdBusiExtendMapper = tCdBusiExtendMapper;

}

}

==========================================================

Part Four:  ThreadPoolTaskExecutor的使用

<!--核心线程池-->
<beanid="taskExecutor" name="taskExecutor_passive"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><propertyname="corePoolSize" value="40"/><propertyname="maxPoolSize" value="100"/><propertyname="queueCapacity" value="3072"/><propertyname="rejectedExecutionHandler"><beanclass="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /><!--调用者运行-->
</property>
</bean>
/**
 * 线程池
 */
@Resource(name = "taskExecutor")
private ThreadPoolTaskExecutor cartPropertyDataGetterTaskExecutor;
public ThreadPoolTaskExecutor getTaskExecutor() {return cartPropertyDataGetterTaskExecutor;
}public void setTaskExecutor(ThreadPoolTaskExecutor taskExecutor) {this.cartPropertyDataGetterTaskExecutor = taskExecutor;
}
// 命令立减查询
if (result.isActivateKeyt() && currentCart.getKeyt() != null && StringUtil.isNotBlank(currentCart.getKeyt().getKeytStr())) {keytFuture = this.getTaskExecutor().submit(new KeytGetter(keytBS, user, siteId, currentCart.getKeyt().getKeytStr(), currentCart, commerceItemList, priceInfo, shippingGroups));
}if (blueCouponsFuture != null) {final BlueCouponSummary blueCouponSummary = buildBlueCouponSummary(blueCouponsFuture.get());result.setBlueCouponsAmount(blueCouponSummary.getUsedAmount()); // 蓝券的使用金额
result.setBlueCouponsNum(blueCouponSummary.getUsedNum()); // 蓝券的使用张数
result.setBlueCoupons(blueCouponSummary.getList());
}
if (shopCouponsFuture != null) {final ShopCouponSummary shopCouponSummary = buildShopCouponSummary(shopCouponsFuture.get());result.setShopCouponsAmount(shopCouponSummary.getUsedAmount()); // 店铺券使用金额
result.setShopCouponsNum(shopCouponSummary.getUsedNum()); // 店铺券使用张数
result.setQueryShopCoupons(shopCouponSummary.getList());
}
if (redCouponsFuture != null) {final RedCouponSummary redCouponSummary = buildRedCouponSummary(redCouponsFuture.get());result.setRedCouponsAmount(redCouponSummary.getUsedAmount()); // 红券使用的金额
result.setRedCouponsNum(redCouponSummary.getUsedNum()); // 红券使用的张数
result.setRedCoupons(redCouponSummary.getList());
}
if (prepaidCardFuture != null) {final PrepaidCardSummary prepaidCardSummary = buildPrepaidCardSummary(prepaidCardFuture.get());result.setPrepaidCardsAmount(prepaidCardSummary.getUsedAmount()); // 预付卡使用的金额
result.setPrepaidCardsNum(prepaidCardSummary.getUsedNum()); // 预付卡使用的张数
result.setPrepaidCards(prepaidCardSummary.getList());
}
VirtualAccountResult virtualAccountResult = null;
if (virtualAccountResultFuture != null) {virtualAccountResult = virtualAccountResultFuture.get();result.setVirtualAccountResult(virtualAccountResult);
}
if ((containsHaiWaiGou || !shouldQueryVirtualAccount(siteId, commerceItemList)) && virtualAccountResult != null) {virtualAccountResult.setPayAmount(DOUBLE_ZERO); // 可用金额为0
}
if (blueCouponsFuture != null) {final BlueCouponSummary blueCouponSummary = buildBlueCouponSummary(blueCouponsFuture.get());result.setBlueCouponsAmount(blueCouponSummary.getUsedAmount()); // 蓝券的使用金额
result.setBlueCouponsNum(blueCouponSummary.getUsedNum()); // 蓝券的使用张数
result.setBlueCoupons(blueCouponSummary.getList());
}
if (shopCouponsFuture != null) {final ShopCouponSummary shopCouponSummary = buildShopCouponSummary(shopCouponsFuture.get());result.setShopCouponsAmount(shopCouponSummary.getUsedAmount()); // 店铺券使用金额
result.setShopCouponsNum(shopCouponSummary.getUsedNum()); // 店铺券使用张数
result.setQueryShopCoupons(shopCouponSummary.getList());
}
if (redCouponsFuture != null) {final RedCouponSummary redCouponSummary = buildRedCouponSummary(redCouponsFuture.get());result.setRedCouponsAmount(redCouponSummary.getUsedAmount()); // 红券使用的金额
result.setRedCouponsNum(redCouponSummary.getUsedNum()); // 红券使用的张数
result.setRedCoupons(redCouponSummary.getList());
}
if (prepaidCardFuture != null) {final PrepaidCardSummary prepaidCardSummary = buildPrepaidCardSummary(prepaidCardFuture.get());result.setPrepaidCardsAmount(prepaidCardSummary.getUsedAmount()); // 预付卡使用的金额
result.setPrepaidCardsNum(prepaidCardSummary.getUsedNum()); // 预付卡使用的张数
result.setPrepaidCards(prepaidCardSummary.getList());
}
VirtualAccountResult virtualAccountResult = null;
if (virtualAccountResultFuture != null) {virtualAccountResult = virtualAccountResultFuture.get();result.setVirtualAccountResult(virtualAccountResult);
}
if ((containsHaiWaiGou || !shouldQueryVirtualAccount(siteId, commerceItemList)) && virtualAccountResult != null) {virtualAccountResult.setPayAmount(DOUBLE_ZERO); // 可用金额为0
}
if (storePointFuture != null) {result.setStorePoint(storePointFuture.get());
}
if (gomedoFuture != null) {result.setGomedo(gomedoFuture.get());
}
if (keytFuture != null) {result.setKeyt(keytFuture.get());
}
package com.gome.pangu.trading.cart.business.taskflow.listcart.task;import java.util.List;
import java.util.concurrent.Callable;import com.gome.framework.bleach.Bleacher;
import com.gome.framework.logging.Logger;
import com.gome.pangu.pricing.client.dto.result.PriceInfoResultRDTO;
import com.gome.pangu.trading.bo.Cart;
import com.gome.pangu.trading.bo.CommerceItem;
import com.gome.pangu.trading.bo.ShippingGroup;
import com.gome.pangu.trading.bo.User;
import com.gome.pangu.trading.keyt.business.KeytBS;
import com.gome.pangu.trading.keyt.client.dto.result.Keyt;/**
 * 命令立减查询服务Callable实现类
 * Created by huangwenfeng on 2016/9/28.
 */
public class KeytGetter implements Callable<Keyt> {private static final Logger LOGGER = Bleacher.getLogger(KeytGetter.class);private final KeytBS keytBS;private final User user;private final String siteId;private final String keytStr;private final Cart currentCart;private final List<CommerceItem> commerceItemList;private final PriceInfoResultRDTO priceInfoResultRDTO;private final List<ShippingGroup> shippingGroups;public KeytGetter(KeytBS keytBS, User user, String siteId, String keytStr, Cart currentCart, List<CommerceItem> commerceItemList, PriceInfoResultRDTO priceInfoResultRDTO,List<ShippingGroup> shippingGroups) {this.keytBS = keytBS;this.user = user;this.siteId = siteId;this.keytStr = keytStr;this.currentCart = currentCart;this.commerceItemList = commerceItemList;this.priceInfoResultRDTO = priceInfoResultRDTO;this.shippingGroups = shippingGroups;}@Override
public Keyt call() throws Exception {try {Keyt keyt = keytBS.queryKeyt(user, siteId, keytStr, currentCart, commerceItemList, priceInfoResultRDTO, shippingGroups);return keyt;} catch (Exception e) {LOGGER.error("调用命令立减查询服务失败,错误信息:", e);LOGGER.error("调用命令立减查询服务失败,用户ID:{},站点ID:{},口令串:{},Cart:{},商品列表:{},价格信息:{},配送单:{}", user.getUserId(), siteId, keytStr, currentCart, commerceItemList, priceInfoResultRDTO, shippingGroups);return null;}}
}
/**
 * 口令立减
 * Created by huangwenfeng on 2016/9/26.
 */
public class Keyt extends BaseModel {private static final long serialVersionUID = 4824030816608236547L;private String keytStr; // 命令串
private double remainingAmount; // 剩余支付金额(OMS备用)
private double amount = 0; // 命令立减兑换到的金额
private int status = 0; // 向前端返回状态错误码 0-初始状态(没有用命令立减) 1-正常(可用命令立减)
public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public String getKeytStr() {return keytStr;}public void setKeytStr(String keytStr) {this.keytStr = keytStr;}public double getRemainingAmount() {return remainingAmount;}public void setRemainingAmount(double remainingAmount) {this.remainingAmount = remainingAmount;}
}

JAVA多线程使用研究相关推荐

  1. 实现 Java 多线程并发控制框架

    2006 年 8 月 14 日 Java 提供了语言级别的线程支持,所以在 Java 中使用多线程相对于 C,C++ 来说更简单便捷,但本文并不是介绍如何在 Java 中使用多线程来来解决诸如 Web ...

  2. Java多线程闲聊(四):阻塞队列与线程池原理

    Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...

  3. 300 行代码带你搞懂 Java 多线程!

    线程 线程的概念,百度是这样解释的: 线程(英语:Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可 ...

  4. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  5. Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger

    一.引言 Semaphore               :一个计数信号量 CountDownLatch          :一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线 ...

  6. fusion 360安装程序的多个实例正在同时运行。_阿里架构师实例讲解——Java多线程编程;详细的不能再详细了...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  7. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  8. java 线程管理框架_实现 Java 多线程并发控制框架

    所面临的问题 图 1. 线程场景 这幅图中节点代表一个 single Thread,边代表执行的步骤. 整幅图代表的意思是,ROOT 线程执行完毕后执行 T1 线程,T1 执行完毕后并发的执行 T2 ...

  9. java多线程编程_Java多线程编程

    本文主要对Java多线程编程进行深入研究.本文通过查看源代码及参考资料等方式研究.参考文章: Java多线程编程深入详解. 由问题入手: 问题1: 2种创建Thread的方式都是实现run()方法,但 ...

最新文章

  1. CV公开课报名 | 快速搭建基于Python的车辆信息识别系统
  2. 获300万美元融资!Dgraph宣布:其图数据库正式发布!
  3. layui select下拉框改变之 change 监听事件
  4. java akiba,Map集合的遍历(java)
  5. 【摄影测量原理】第二章:单幅影像解析基础
  6. 深入掌握JMS(三):MessageListener
  7. sqlserver数据库安装后服务配置
  8. 扑克牌的完美洗牌算法
  9. 如何解二阶齐线性微分方程
  10. wps合并重复项并求和_如何在excel合并同类项数据并求和(去除重复项)
  11. 云更新服务器更新不了最新游戏,云更新服务器环境要求 | 专业网吧维护
  12. 手把手教你用frp内网穿透
  13. 无线充电动牙刷芯片方案功能和原理介绍
  14. 炸裂了!3分钟用GPT4做一个PPT!
  15. Python自动化开发从浅入深-进阶(script,dom,jquery 基础)
  16. 基于用户组织角色权限和资源的五要素
  17. 猎人打猎(二)----利用继承
  18. 使用 content-visibility 优化渲染性能
  19. python爬虫第二弹-多线程爬取网站歌曲
  20. 我与我的专业计算机作文500字,电脑让我欢喜让我忧作文500字

热门文章

  1. JavaScript通过键盘让div盒子上下左右的移动
  2. 如何成为github开源项目的贡献者contributor
  3. steamvr自定义按键_一体机使用键盘鼠标玩SteamVR游戏
  4. 虚拟服务器上磁盘没有初始化,虚拟磁盘
  5. Web页面开发之旅——HTML
  6. Java的System.getProperty()方法获取信息的用法
  7. 【CubeMX配置STM32使用360°旋转编码器(KY-040)】
  8. hibernate-jpa中criteriaBuilde[or]用法
  9. ai物流智能调度 效率对比_人工智能在物流中:人工智能改变物流的5种方式
  10. 虚拟机 Ubuntu 解决静态ip配置问题