首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发将某些内容放入地图时发生NullPointerException

并发将某些内容放入地图时发生NullPointerException
EN

Stack Overflow用户
提问于 2018-10-24 17:00:31
回答 1查看 1.7K关注 0票数 0

我通过运行几个sql来使用map来存储数据。最近我想提高搜索的效率,所以我创建了一些线程,每个线程对应于每个sql,然后同时将查询结果放到映射中。在运行代码时,我得到了NullPointerExceptions,但不知道为什么。下面是我的代码:

代码语言:javascript
复制
public Map<String, Object> getIndexStatistics(final Integer themeId, final String time, final Integer projectId) {
    final Map<String, Object> res = new ConcurrentHashMap<>();
    final AtomicInteger ai = new AtomicInteger(0);
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part1", getSumVolume(themeId, time, true, projectId));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part2", getVolumeTendency(themeId, time, projectId));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part3", getPlatformDistribution(themeId, time, projectId));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part4", getFeelingProportion(themeId, time, projectId));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part5", getLocationDistribution(themeId, time, projectId));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part6", getPositiveCloudList(themeId, time));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part7", getNegativeCloudList(themeId, time));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part8", getLatestNegativeSentiments(themeId, time, projectId));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("part9", getHotRank(themeId, time, null, projectId));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("statistic_counts", getCountStatistics(time, themeId, projectId));
            ai.getAndIncrement();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            res.put("region_counts", getRegionDistribution(themeId, time, projectId));
            ai.getAndIncrement();
        }
    }).start();
    while (true) {
        if (ai.get() == 11) {
            break;
        }
    }
    return res;
}

堆栈跟踪:

代码语言:javascript
复制
java.lang.NullPointerException
    at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)
    at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)
    at com.bolaa.main.service.impl.ProjectNameDataServiceImpl$7.run(ProjectNameDataServiceImpl.java:309)
    at java.lang.Thread.run(Thread.java:748)

顺便说一下,所有的操作都是加法和puttings。我需要使用AtomicInteger和ConcurrentHashMap吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-24 17:27:56

您可以使用其他类型的线程池1来提高函数的效率和测试结果。

问题是有一个函数没有返回值2。像哈希表但不像HashMap,这个类不允许将null用作键或值。

您可以在所有线程中将function的参数更改为值123,并查找出错的函数。或者测试

代码语言:javascript
复制
final int errno= -1
if(getFeelingProportion(themeId, time, projectId)==null)
        res.put("part4", errno);
else
        res.put("part4", getFeelingProportion(themeId, time, projectId));
ai.getAndIncrement();

1 2

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52964909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档