2 qq 27836205 qq_27836205 于 2017.08.30 16:39 提问

java 求四千多用户的某一排名 如何用多线程 优化for循环

求四千多用户的某一排名,比如操作次数排名(不考虑sql写法),我先求出所有用户,然后for循环全部用户,得出每一个用户的操作次数,将用户名和对应操作次数放入一个map里面,再把这个map放入一个list里面,最后排出前十名,现在我想用多线程优化for循环,但是多线程的匿名内部类里面的全局变量只能是final的,final变量只能赋值一次啊,我就不能连续添加值到那个list里面了 怎么办?还有比如我现在开四个线程,每个线程for循环一千次,那么我如何写,等到四个线程全部结束再执行下面操作呢?

8个回答

caozhy
caozhy   Ds   Rxr 2017.08.31 08:59
已采纳
qq_38005982
qq_38005982   2017.08.30 17:06

我咋这么懵B呢!你就要前10名,根据操作次数来?是这意思么?这样的你一次for求出所有的时候加个判断操作次数不就直接区分了么?把操作次数作为map的KEY
就存10个从大向小依次对比,然后如果大于了替换不行么?最多也就一次大循环,一次小循环

qq_33727653
qq_33727653   2017.08.30 17:14

(⊙﹏⊙)b 楼主这是自己想的东西写着玩的吧?。。。。。为啥要用匿名内部类? 用内部类不就行了吗? 参数不是问题了!!!要想让子线程全部执行完再去执行主线程里的代码,就在主线程(就是你主代码的那个类)定义一个标志位(或符),等待子线程执行完。。。我只能说这也就玩玩!!

Druning
Druning   2017.08.30 17:18

从4000个数据中取最大的前10个,用堆比较快,设置一个大小为10的大根堆,不断往堆里push就行了。
要控制线程的执行顺序,需要用锁。

u013855332
u013855332   2017.08.30 18:59

用堆是正解,使用一个线程安全的最大堆,起多个线程去计算每个元素的大小值,将计算结果放到堆中,最后遍历堆即可。

ljheee
ljheee   Rxr 2017.08.30 22:15

四千多用户的某一排名 ,这些信息数据时存数据库的,就从数据库查

huang931027
huang931027   2017.08.31 08:56

恕我直言,就四千多用户用多线程都是浪费

qwer123qwerz
qwer123qwerz   2017.10.17 09:32

我有个想法,就是是用treemap,将用户类实现Comparable重写compareTo用来比较操作次数
,或者使用Comparator比较,在你向集合添加的时候就已经排序了,直接取出前十个就ok

Csdn user default icon
上传中...
上传图片
插入图片