Des exemples de multithread

Scénario est la suivante

Il y a beaucoup de marques, il y a plus de produits disponibles dans chaque marque, et maintenant vous voulez filtrer quelles marques n'ont pas la marchandise.

À l'exception de possible, il ne peut pas blinder utilisateur du produit, donc il y a une logique de filtrage.

Par exemple, il est la marque sous le Maître Kong Maître thé Kong, nouilles instantanées Maître Kong, etc., leur fille sous la marque avait rien, il est impératif fille filtré, laissant le Maître.

Filtre suit fil

//得到品牌下商品的个数
class CountGoods implements Callable<Integer>{
    //分页参数
    PageRequest request;
    //品牌id
    Long brandId;
    //所有品牌列表,如果传入的品牌无效,就将此列表的该品牌去掉
    CopyOnWriteArrayList<Long> brandList;

    public CountGoods(PageRequest request, Long brandId, CopyOnWriteArrayList<Long> brandList){
        this.request = request;
        this.brandId = brandId;
        this.brandList = brandList;
    }

    @Override
    public Integer call() throws Exception{
        //获取所有品牌下商品
        Map<Long,List<Long>> brandSkuMap = getBrand(request.getBpin());
        //获取该品牌下的商品
        List<Long> subSkuList = brandSkuMap.get(fBrandId);
        //防止空数据
        if(subSkuList == null){
            return 0;
        }
        //对该品牌下的商品进行过滤
        List<GoodsInfo> goodsInfo= goodsRpc.synFilterSku(request.getBpin(), subSkuList);
        if(goodsInfo== null){
            return 0;
        }else{
            if(goodsInfo.size() == 0){
                brandList.remove(brandId);
            }
            return goodsInfo.size();
        }
    }
}

Filtre multi-thread

public List<Long> filterBrandList(PageRequest request, List<Long> IdList){
    List<Callable<Integer>> calls = new ArrayList();
    //过滤逻辑
    Iterator<Long> iterator = IdList.iterator();
    while(iterator.hasNext()){
        Long brandId =iterator.next();
        Callable call = new countId(request, brandId , (CopyOnWriteArrayList<Long>) IdList);
        calls.add(call);
    }

    ExecutorService cacheThreadPool = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
    List<Future<Integer>> callableResult = null;
    try{
        if(calls != null && calls.size() > 0){
            callableResult = cacheThreadPool.invokeAll(calls);
        }
    }catch (Exception e){
        e.printStackTrace();
        LogUtil.printErrorLog(log, "多线程过滤品牌出现异常");
    }finally {
        cacheThreadPool.shutdown();
    }
    return fontBrandIdList;
}

défaut

Il ne fait aucun doute que ce code sur une ligne à court de bug.

erreur très étrange, qui est quand le thread d'exécution, fils d'exécution dans le mauvais filtrage, mais certains sont exécutés avec succès.

Mieux vaut ne pas leur sœur, et est finalement arrivé à un week-end de question, je ne semble pas donner une file d'attente de blocage ......

Remarque, ce problème de blocage de la file d'attente de pool de threads, ont besoin d'être modifié, de sorte que 10 tâche plus, plus sera rejeté. Modifier le pool de threads type file d'attente peut être bloqué.

new SynchronousQueue<Runnable>()

Ce n'est pas la file d'attente de blocage moyenne.

Modifié comme suit:

ExecutorService cacheThreadPool = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(100))

Mais il y a un problème:

Remarque, de sorte que le nouveau pool de threads directement dans la méthode de service est à tort, car il ne peut pas réutiliser fil. Par exemple, deux personnes ont visité cette méthode, vous êtes un nouveau pool de threads, ne pas utiliser le même pool de threads, mais si compliqué par le nombre élevé de montée subite de threads est susceptible de se bloquer. Vous devriez recevoir un pool de threads statique, ou d'écrire un haricot séparé de pool de threads, réutilisation partout.

Publié 67 articles originaux · louange gagné 32 · vues + 60000

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43751710/article/details/104608941
conseillé
Classement