Callable 对象 Future异步计算 统计结果

        ExecutorService pool = Executors.newFixedThreadPool(MAX_THREAD_CNT);

        Map<DBNeInfo, String> resultMap = new HashMap<DBNeInfo, String>();

        List<Future<Map<DBNeInfo, String>>> futures = new ArrayList<Future<Map<DBNeInfo, String>>>();

        try
        {
            //并发执行任务
            for (DBNeInfo ne : nelist)
            {
                futures.add(pool.submit(new UpdatDnsTask(ne, dnsIp, dnsIpBak)));
            }
        }
        finally
        {
            pool.shutdown();
        }

        //获取返回结果
        for (Future<Map<DBNeInfo, String>> future : futures)
        {
            try
            {
                Map<DBNeInfo, String> map = future.get();
                if ((null != map) && !map.isEmpty())
                {
                    resultMap.putAll(map);
                }
            }
            catch (InterruptedException e)
            {
                logger.error("updateDnsToNe InterruptedException", e);
            }
            catch (ExecutionException e)
            {
                logger.error("updateDnsToNe ExecutionException", e);
            }
        }

        logger.debug("syncNeFromSLBs end");

        return resultMap;
 /**
     * 并发更新dns任务
     */
    private class UpdatDnsTask implements Callable<Map<DBNeInfo, String>>
    {
        /**
         * ip地址
         */
        private final DBNeInfo ne;

        private final String dnsIp;

        private final String dnsIpBak;

        /**
         * 构造函数
         * 
         * @param ip 同步网元的IP地址
         * @param isAddSelf 是否返回本身的网元信息
         * @throws CDNException 异常信息
         */
        public UpdatDnsTask(final DBNeInfo ne, final String dnsIp, final String dnsIpBak) throws CDNException
        {
            if (ne == null)
            {
                throw new CDNException("ne is null");
            }
            this.ne = ne;
            this.dnsIp = dnsIp;
            this.dnsIpBak = dnsIpBak;
        }

        @Override
        public Map<DBNeInfo, String> call() throws CDNException
        {
            return updateDns(ne, dnsIp, dnsIpBak);
        }}

Callable 返回计算结果,可以抛出异常,Runnable 不能返回结果,不能抛出异常。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章