`
zy116494718
  • 浏览: 472242 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ThreadLocal线程池实例

 
阅读更多

学习了多线程的理论后,下面我们来看工作中遇到的一个具体实例。

 

 

    public Integer startAreaIndex(List<Long> activityIds) {
        //获取所有常规频道的区块,这里得到的区块为4个,所以最终会启用4个线程
        List<Area> areaList = areaServiceStub.queryAreaListByActivityIds(activityIds);
        LogTypeEnum.ACTIVITY_SOLR.info("solr开始索引,场频频道活动下的区块list:{}", areaList);
        if (CollectionUtils.isEmpty(areaList)) {
            return -1;
        }
        LogTypeEnum.ACTIVITY_SOLR.info("-----------------solr常规频道全量索引开始-----------------");
        //一个区块执行一个线程
        Iterator<Area> areaIterator = areaList.iterator();
        while (areaIterator.hasNext()) {
            Area area = areaIterator.next();
                AreaApplyTask areaApplyTask = new AreaApplyTask();
                areaApplyTask.setArea(area);
                areaApplyTask.setSolrWareService(solrWareService); //从这里注入的话,AreaApplyTask 就不用实现Spring的接口了
                areaApplyTask.setSolrActivityService(solrActivityService);
                areaApplyTask.setSolrPromoService(solrPromoService);
                solrIndexTaskExecutor.execute(areaApplyTask);
        }
        try{
            Thread.sleep(1000);   //这里先睡眠1秒,防止创建线程的时间长,导致下面第一次取活跃线程数为0,然后就直接break了
        }catch (Exception e){
            LogTypeEnum.ACTIVITY_SOLR.error("Solr线程索引失败", e);
        }
        for (; ; ) {
            int count = solrIndexTaskExecutor.getActiveCount();
            LogTypeEnum.ACTIVITY_SOLR.info("Solr Index Active Threads : " + count);
            try {
                Thread.sleep(1000);  //每隔1秒判断一次活跃线程数
            } catch (InterruptedException e) {
                LogTypeEnum.ACTIVITY_SOLR.error("Solr线程索引失败", e);
                return -1;
            }
            if (count == 0) {
                break;
            }
        }
        return 0;
    }

 

   AreaApplyTask类:

 

   

public class AreaApplyTask implements Runnable{

    private Area area;
    private WareService solrWareService;
    private PromoService solrPromoService;
    private ActivityService solrActivityService;

    public void run() {
        Area area = getArea();
        if(area != null && area.getType() != null){
            Integer areaType = area.getType();
            if(areaType.equals(AreaType.PROMO.getType())){  //促销区块
                //促销
                solrPromoService.indexByArea(area);
            }else if(areaType.equals(AreaType.WARE.getType())){
                //商品
                solrWareService.indexByArea(area);
            }else if(areaType.equals(AreaType.SHOP.getType())){
                //活动
                solrActivityService.indexByArea(area);
            }else if(AreaType.BRAND.isEqual(areaType)){
                //活动
                solrActivityService.indexByArea(area);
                //促销
                solrPromoService.indexByArea(area);
            }
        }
    }

    public Area getArea() {
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }

    public void setSolrWareService(WareService solrWareService) {
        this.solrWareService = solrWareService;
    }

    public void setSolrPromoService(PromoService solrPromoService) {
        this.solrPromoService = solrPromoService;
    }

    public void setSolrActivityService(ActivityService solrActivityService) {
        this.solrActivityService = solrActivityService;
    }
}

 

    

public long indexByArea(Area area){
        /*
           这里为了方便多台机器可以同时跑,而且时间可以从页面传过来,采用了redis的方式,这里
           key为money,value的值在页面上设的为需要重刷solr的批次日期,例如:2016-12-07 00:00:00|2016-12-08 00:00:00|
           这里表示需要重新刷solr的批次日期为12月7日和8日,第一个机器执行后,第二个机器就会跑第二个时间
         */

        String key ="money";
        String time = activityUtilService.getRedisKeyValue(key);
        String beginTime = time.substring(0,time.indexOf("|"));
        String nextBeginTime = time.substring(time.indexOf("|")+1);
        activityUtilService.setInfoToRedisKey(key,1000*60*60,nextBeginTime);

        Batch batch = new Batch();
        batch.setActivityId((long)158001);
        batch.setBeginTime(DateUtil.createDate(beginTime, "yyyy-MM-dd HH:mm:ss"));
        batch.setEndTime(DateUtil.addDay(batch.getBeginTime(),1));
        List<Batch> batchList = batchServiceStub.getBatchTimeLineRangeList(batch);
        List<Long> batchIdList = new ArrayList<Long>();
        for(Batch batch1:batchList){
            batchIdList.add(batch1.getId());
        }
        Long areaId = area.getId();
        ApplyWareParam applyWareParam = new ApplyWareParam();
        applyWareParam.setBatchIdList(batchIdList);
        applyWareParam.setStatus(0);
        List<ApplyWare> applyWareList = applyWareServiceStub.getApplyWareListByBatchIds(applyWareParam, 1, 10000);
        LogTypeEnum.ACTIVITY_SOLR.warn("applyWareList=="+applyWareList.size()+",areaId="+area.getId());
        if(CollectionUtils.isEmpty(applyWareList)){
            return -1L;
        }
        ApplyPromoInfo applyPromoInfoParam = new ApplyPromoInfo();
        applyPromoInfoParam.setAreaId(areaId);
        //查出该区块下的所有促销提报列表
        List<ApplyPromoInfo> applyPromoInfoList = applyPromoInfoDao.queryForList(applyPromoInfoParam,1,Integer.MAX_VALUE);

        //把applyPromoInfoList中的促销ID合并到applyWareList中
        mergePromoListToWareList(applyWareList,applyPromoInfoList);

        return index(applyWareList);
    }

 

 

0
0
分享到:
评论

相关推荐

    leetcode下载-JavaTopic:Java面试题总结

    ThreadLocal的原理? spring事务7种传播特性和隔离级别的理解? spring boot的启动过程 spring事务实现的原理 aop切面 如何解决spring循环依赖问题? Redis篇: redis持久化的原理(RDB、AOF); redis缓存穿透、...

    JenkovTutorial:这是http上Jenkov教程的练习示例

    (2个示例使用一个实例和两个实例)。 线程本地。 (带有ThreadLocal变量的示例)。 线程信令。 (带有4个不同的MyWaitNotify对象的2个示例)。 锁具4.1。 基本(带有2个不同的Counter对象的示例)。 4.2。 可重入...

    Java并发编程(学习笔记).xmind

    ThreadLocal类 只读共享:不变对象一定是线程安全的 尽量将域声明为final类型,除非它们必须是可变的 分类 不可变对象 事实不可变对象 线程安全共享 封装有助于管理复杂度 线程...

    Java并发编程实战

    3.3.3 ThreadLocal类 3.4 不变性 3.4.1 Final域 3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用...

    Java 并发编程实战

    3.3.3 ThreadLocal类 3.4 不变性 3.4.1 Final域 3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用...

    Spring-Reference_zh_CN(Spring中文参考手册)

    ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. ...

    Spring 2.0 开发参考手册

    ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量...

    spring chm文档

    ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量...

    Spring中文帮助文档

    ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.2.1. Mock对象 8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 8.3.3. ...

    Spring API

    ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.2.1. Mock对象 8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 8.3.3. ...

    疯狂JAVA讲义

    学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 使用内部类 208 学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics