我有一组供应商,它们都有相同的结果,但速度不同(且不同).
我想要一种优雅的方式同时启动供应商,并且只要其中一个产生了价值,就将其退回(丢弃其他结果).
我已经尝试过使用并行流,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) 假设我有一个Flowable,它在应用程序的不同部分之间共享.
在我想要观察它的每个片段中,我将其转换为LiveData LiveDataReactiveStreams.fromPublisher
以避免泄漏和崩溃.我现在有一个包装我的Flowable的LiveData.
然后我将LiveData传递给我的ViewModel(在ViewModelFactory中).据我了解,我可以继续使用LiveData而不用担心泄漏.
现在,我不想直接观察LiveData,而是试图将它转换回Flowable with LiveDataReactiveStreams.toPublisher
和Flowable.fromPublisher
,而是订阅Flowable.这是一个Flowable,它包装了一个包装Flowable的LiveData
我的问题是:我是否要担心处理此Flowable的订阅?我希望LiveData会充当"障碍",防止我的上下文泄漏回根Flowable,但我不太确定.
换一种说法:
当碎片被破坏时,在C中访问的视图是否泄漏到A?
android memory-leaks rx-java2 android-livedata android-architecture-components
我正在制作一个带有滚动视图的2D游戏(想想Red Alert或Zelda),但我正在绘制图纸.
基本上,地图上绘制了两种类型的对象.有些人有固定的位置(如树木和建筑物),有些则有移动(玩家,敌人,飞行箭头).
要使事物以正确的方式出现在彼此前面,需要按特定顺序绘制(首先是远处的物体并朝向"相机"工作).
现在我每次游戏更新(每秒100次)时都会对所有对象(两种)的列表进行排序,这感觉就像浪费了大量的CPU时间.对象的顺序很少变化,当它们发生时,它们通常只在列表中向上或向下移动一个位置.
另一个问题是只需要考虑实际在屏幕上的对象.由于地图可能变得非常大,有1000个物体,我不想每秒100次对它们进行排序.
你怎么建议我解决这个问题?
我有一个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,所以我现在有点卡住了.
Java标准库中的大多数集合的文档(例如ConcurrentLinkedQueue,ConcurrentLinkedDequeue和ConcurrentSkipListSet)附带以下免责声明:
请注意,与大多数集合不同,size方法不是常量操作.由于这些集合的异步性质,确定当前元素数量需要遍历元素,因此如果在遍历期间修改此集合,则可能会报告不准确的结果.
那是什么意思?为什么他们不能保留一个计数器(例如,一个AtomicInteger)并只返回调用的值size()
?
是因为计数器必须同步,因此会产生阻塞点?
另外,ConcurrentHashMap似乎没有这个问题.这是为什么?查看源代码,似乎它使用保存在数组中的多个计数器,这些计数器在调用时求和size()
.这是为了规避阻塞点还是有另一个原因?
java ×3
android ×1
android-architecture-components ×1
collections ×1
concurrency ×1
gradle ×1
java-8 ×1
java-stream ×1
memory-leaks ×1
performance ×1
rx-java2 ×1
sorting ×1