我有以下JSONObject。我有一个名为results的属性,它又是一个JSONArray,由JSONObjects组成。现在我想看看是否有任何直接的方式来获取集合形式的id,而无需在地图或列表中明确创建和stroing。预期的输出是:
输出:
["123","345","567","891"]
的JSONObject:
{
"status": {
"status": "OK",
"message": ""
},
"offset": 1,
"limit": "200",
"results": [
{
"id": “123”,
"title": “title1”
},
{
"id": “345”,
"title": “title2”
},
{
"id": “567”,
"title": “title3”
},
{
"id": “891”,
"title": “title4”
}
]
}
现在我获取JSONArray结果并迭代它并在MAP中保存每次迭代的值。参见下文:
for (int k = 0; k <= resultsArray.length()-1 ; k++) {
JSONObject j = resultsArray.getJSONObject(k);
id = j.getLong("id");
map.put(title,
"\"" + Long.toString(id) + "\"");
}
原因: 这是在一个多线程环境中,如果我创建一个将成为共享资源的映射,我需要同步它,这将锁定另一个线程对该映射的使用,这反过来导致我的情况下出现大的性能问题。
有什么建议吗?
答案 0 :(得分:1)
根据您的评论,您似乎关注的不是创建列表或散列图,而是您尝试协调跨多个不同线程创建生成的集合。
您可以采取许多方法,哪种方法最好取决于您的具体用例。
最简单的(代码方式)可能是使用隐式并发的集合,如ConcurrentHashMap或包含在Collections.synchronizedList()中的列表。您可能会发现这些集合的性能优于尝试管理自己的线程锁定,但很难说性能是否足以满足您的需求。
另一种可能性是让每个线程解析json并独立生成一个单独的集合,因此大部分工作都是以线程安全的方式完成的,然后将结果合并到一个线程安全/同步动作中在末尾。这只有在id列表是循环的所需输出时才有效,并且在所有线程完成处理之前,您不需要中间结果可用。但是,如果这对您有用,那么您可能会获得更好的性能,而不是让10个线程在整个过程中争用单个资源。