小编Gus*_*son的帖子

使用并行流返回最快的提供值

我有一组供应商,它们都有相同的结果,但速度不同(且不同).

我想要一种优雅的方式同时启动供应商,并且只要其中一个产生了价值,就将其退回(丢弃其他结果).

我已经尝试过使用并行流,Stream.findAny()但是它总是会阻塞,直到产生所有结果.

这是一个单元测试,展示了我的问题:

import org.junit.Test;

import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import java.util.stream.Stream;

import static org.junit.Assert.*;

public class RaceTest {

    @Test
    public void testRace() {
        // Set up suppliers
        Set<Supplier<String>> suppliers = Collections.newSetFromMap(new ConcurrentHashMap<>());
        suppliers.add(() -> "fast"); // This supplier returns immediately
        suppliers.add(() -> {
            try {
                Thread.sleep(10_000);
                return "slow";
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }); // This supplier takes 10 seconds to produce a value

        Stream<Supplier<String>> stream = …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing multithreading java-8 java-stream

13
推荐指数
1
解决办法
1052
查看次数

我是否需要处置()使用LiveDataReactiveStreams创建的发布者

假设我有一个Flowable,它在应用程序的不同部分之间共享.

在我想要观察它的每个片段中,我将其转换为LiveData LiveDataReactiveStreams.fromPublisher以避免泄漏和崩溃.我现在有一个包装我的Flowable的LiveData.

然后我将LiveData传递给我的ViewModel(在ViewModelFactory中).据我了解,我可以继续使用LiveData而不用担心泄漏.

现在,我不想直接观察LiveData,而是试图将它转换回Flowable with LiveDataReactiveStreams.toPublisherFlowable.fromPublisher,而是订阅Flowable.这是一个Flowable,它包装了一个包装Flowable的LiveData

我的问题是:我是否要担心处理此Flowable的订阅?我希望LiveData会充当"障碍",防止我的上下文泄漏回根Flowable,但我不太确定.

换一种说法:

  1. Flowable A存在于全局上下文中
  2. 在每个片段中,A被包装在LiveData B中,该数据被设置为片段ViewModel的属性
  3. 通常我会观察LiveData B,而是将其包装在Flowable C中
  4. 我订阅Flowable C并忽略退回的一次性用品

当碎片被破坏时,在C中访问的视图是否泄漏到A

android memory-leaks rx-java2 android-livedata android-architecture-components

8
推荐指数
1
解决办法
594
查看次数

订单很少变化的快速排序

我正在制作一个带有滚动视图的2D游戏(想想Red Alert或Zelda),但我正在绘制图纸.

基本上,地图上绘制了两种类型的对象.有些人有固定的位置(如树木和建筑物),有些则有移动(玩家,敌人,飞行箭头).

要使事物以正确的方式出现在彼此前面,需要按特定顺序绘制(首先是远处的物体并朝向"相机"工作).

现在我每次游戏更新(每秒100次)时都会对所有对象(两种)的列表进行排序,这感觉就像浪费了大量的CPU时间.对象的顺序很少变化,当它们发生时,它们通常只在列表中向上或向下移动一个位置.

另一个问题是只需要考虑实际在屏幕上的对象.由于地图可能变得非常大,有1000个物体,我不想每秒100次对它们进行排序.

你怎么建议我解决这个问题?

java sorting performance

6
推荐指数
1
解决办法
147
查看次数

uploadArchives with mavenDeployer to multiple repos

我有一个gradle项目,就像其他两个项目的公共库一样.

其他两个项目各自托管一个嵌入式maven存储库,我希望将公共项目部署到该存储库.

我试过这个:

uploadArchives {
    repositories {
        mavenDeployer {
            repositories {
                repository(url: '../../../project-web-service/repo')
                repository(url: '../../../project-app/repo')
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这仅部署到第二个回购.

我已经阅读了Gradle build中的配置多个上传存储库,但它没有涵盖mavenDeployer,所以我现在有点卡住了.

gradle

6
推荐指数
1
解决办法
980
查看次数

并发收集大小计算

Java标准库中的大多数集合的文档(例如ConcurrentLinkedQueue,ConcurrentLinkedDequeueConcurrentSkipListSet)附带以下免责声明:

请注意,与大多数集合不同,size方法不是常量操作.由于这些集合的异步性质,确定当前元素数量需要遍历元素,因此如果在遍历期间修改此集合,则可能会报告不准确的结果.

那是什么意思?为什么他们不能保留一个计数器(例如,一个AtomicInteger)并只返回调用的值size()

是因为计数器必须同步,因此会产生阻塞点?

另外,ConcurrentHashMap似乎没有这个问题.这是为什么?查看源代码,似乎它使用保存在数组中的多个计数器,这些计数器在调用时求和size().这是为了规避阻塞点还是有另一个原因?

java collections concurrency multithreading

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