小编jad*_*adz的帖子

使用 Java 多线程,协调寻找最佳结果的最有效方法是什么?

让我说清楚,我在下面描述的方法是可操作的。我希望提高该方法的吞吐量。它有效,而且效果很好。我们正在寻求进一步扩展吞吐量,这就是我正在研究这一点的原因。

手头的任务是提高评分算法的性能,该算法返回一组任务的最佳分数。我收集了使用ExecutorService. 每个任务检查它现在是否有最好的分数,如果它是新的最好的,则以同步的方式更新最好的分数。为了深入了解我正在处理的规模,每项任务只需要几分之一毫秒即可完成,但有数千个任务,因此需要数百毫秒才能找到最佳任务。我每分钟执行数百次这个评分算法。结果是 60 秒中有 30 秒用于运行此评分算法。

当我的线程池为 8 个线程(具有 24 个虚拟内核)时,每个任务需要 0.3 毫秒。当我有 20 个线程(同一台机器,24 个虚拟核心)时,每个任务需要 0.6 毫秒。我怀疑当我向我的ExecutorService线程池添加更多线程时,我的性能会因为最佳分数的同步而变得更糟(更多线程争用锁)。

我已经做了很多搜索,但似乎无法找到令人满意的(实际上,我似乎找不到任何)替代方案。我正在考虑收集所有分数并按排序顺序存储,或者在所有任务完成后排序——但我不确定这是否会有任何改进。

有没有人对另一种更有效的收集最高分的方法有任何想法?

这是当前的方法:

final double[] bestScore = { Double.MAX_VALUE };
// for each item in the collection {
    tasks.add(Executors.callable(new Runnable() {
        public void run() {
            double score = //... do the scoring for the task
            if (score < bestScore[0]) {
                synchronized(bestScore) {
                    if (score < bestScore[0]) { // check again after we have the lock
                        bestScore[0] = …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading java-8

5
推荐指数
1
解决办法
389
查看次数

标签 统计

concurrency ×1

java ×1

java-8 ×1

multithreading ×1