java多线程编程题代码解析

TheDisguiser 2020-09-07 17:07:00 java常见问答 6043

多线程是近代互联网兴起的一种编程技术,能够极大的提升运行效率,本篇文章我们就来了解些常见多线程编程题。

示例:

//多线程查询
//定义异步计数器   管理一共多少个线程 
CountDownLatch latch = new CountDownLatch(dates.length);
//接受返回的结果 
Map resultListMap = new HashMap();
//线程池管理类(核心线程数,最大线程数,超过核心线程数的空闲线程最大存活时间,时间单位,阻塞任务队列) 
ThreadPoolExecutor exce = new ThreadPoolExecutor(200, 150000, 1, TimeUnit.NANOSECONDS, new SynchronousQueue < Runnable > ());
//for循环多条异步查询
for (int i = 0; i < dates.length; i++)
{
    //设置参数
    Map paramNew = new HashMap();
    String beginDate = dates[i].split(",")[0]; //开始时间
    String endDate = dates[i].split(",")[1]; //结束时间
    paramsMap.put("beginDate", beginDate.replace("-", ""));
    paramsMap.put("endDate", endDate.replace("-", ""));
    paramsMap.put(objIdKey, objId);
    if (!"0".equals(bodyTypeId))
    {
        paramsMap.put("bodyTypeId", bodyTypeId);
    }
    paramNew.putAll(paramsMap);
    paramNew.put("selectType", "query");
    try
    {
        exce.execute(new Worker(latch, paramNew, resultListMap, dao, i));
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
exce.shutdown();
try
{
    //线程阻塞,等待所有线程完成才继续执行下面的代码 
    latch.await();
}
catch (InterruptedException e)
{
    e.printStackTrace();
}
System.out.println("=================over================");
//拿到查询结果挨个做处理
for (int i = 0; i < dates.length; i++)
{
    //参数设置
    String beginDate = dates[i].split(",")[0]; //开始时间
    String endDate = dates[i].split(",")[1]; //结束时间
    String legend = beginDate.substring(0, 4); //图例
    paramsMap.put("beginDate", beginDate.replace("-", ""));
    paramsMap.put("endDate", endDate.replace("-", ""));
    paramsMap.put(objIdKey, objId);
    if (!"0".equals(bodyTypeId))
    {
        paramsMap.put("bodyTypeId", bodyTypeId);
    }
    //把查询结果按顺序拿出来
    List < PriceIndexEntity > list = new ArrayList < PriceIndexEntity > ();
    //成交价维度新算法
    list = (List < PriceIndexEntity > ) resultListMap.get(i);
    //对list处理
    ......
}
/***内部类Worker***/
static public class Worker extends Thread
{
    //定义异步计数器   管理一共多少个线程 
    private CountDownLatch latch;
    //参数 
    private Map param;
    //要返回的结果集 
    private Map resultListMap;
    //重新给一个dao
    private IPriceIndexDao dao;
    //排序字段
    private int i;
    public Worker(CountDownLatch latch, Map param, Map resultListMap, IPriceIndexDao dao, int i)
    {
        super();
        this.latch = latch;
        this.param = param;
        this.resultListMap = resultListMap;
        this.dao = dao;
        this.i = i;
    }
    @Override
    public void run()
    {
        try
        {
            List list = null;
            if ("export".equals(param.get("selectType")))
            {
                if (param.get("priceType")
                    .equals("1"))
                {
                    list = dao.exportPriceIndexOriginalTpData(param);
                }
                else
                {
                    list = dao.exportPriceIndexOriginalMsrpData(param);
                }
            }
            else
            {
                if (param.get("priceType")
                    .equals("1"))
                {
                    list = dao.getPriceIndexAnalysTpData(param);
                }
                else
                {
                    list = dao.getPriceIndexAnalysMsrpData(param);
                }
            }
            resultListMap.put(i, list);
            //当前线程执行完  计数器-1 
            latch.countDown();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

以上就是本篇文章的所有内容,还需要了解一些其他的java经典实例题的话就请持续关注我们网站吧。

推荐阅读:

java多线程wait,notify浅析

java多线程面试题一般有哪些?java面试题及答案2020

java多线程使用场景有哪些?有何作用?