Tag: 协同程序

协程异常处理程序为什么使原始异常加倍?

我实现了我自己的async ,我不能以正确的方式处理异常。 为什么? val expected = IllegalStateException(); val it = async<Any> { throw expected; }; assert.that({ it.get() }, throws(equalTo(expected))); // ^— but it throws a IllegalStateException(cause = expected) 源代码 interface Response<in T> { suspend fun yield(value: T); } interface Request<out T> { fun get(): T; fun <R> then(mapping: (T) -> R): Request<R>; } private val […]

协程怎么比线程快?

我试图找到一种情况,将多线程更改为协程将加快处理受影响的代码部分。 据我发现,与线程相比,协程使用更少的CPU和堆空间,但我仍然无法找到协程比线程更快的情况。 虽然我知道,协程创建和上下文切换比使用线程的相应操作便宜得多,但是我在速度差异上没有察觉到结果(没有测量线程创建,两种情况都是完全相同的)。 那么,甚至有可能找到一个协程比线程更快执行的情况呢?

将通道桥接到一个序列

该代码基于Coroutines指南示例:扇出 val inputProducer = produce<String>(CommonPool) { (0..inputArray.size).forEach { send(inputArray[it]) } } val resultChannel = Channel<Result>(10) repeat(threadCount) { launch(CommonPool) { inputProducer.consumeEach { resultChannel.send(getResultFromData(it)) } } } 创建一个Sequence<Result>的正确方法是什么?

什么是协程?

什么是协程? 它们与并发有什么关系?

协程只是完成句柄的语法糖?

协程只是完成块周围的语法糖,完成块将在引擎盖下创建? 或者,协程的概念更为复杂和广泛,只是编译器把戏又称为语法糖

我可以通过在Java代码中使用它们来利用Kotlin的协同程序吗?

我的目标是什么? 我的目标是能够使用Java的Kotlin的Coroutine系统。 我希望能够暂停执行一段时间,然后在给定的时间过去之后在那个位置重新找回。 从Java,我希望能够执行任务,而不是以异步方式暂停执行中间执行,例如: //example 1 someLogic(); pause(3000L); //3 seconds someMoreLogic(); //example 2 while(true) { someContinuedLogic(); pause(10000L); //10 seconds } 我的问题是什么? 正如所料,我能够从Kotlin中完美地执行协程,但是对于Java来说,它变得棘手,因为代码的Java部分立即执行整个块而没有任何暂停,而Kotlin块正确地暂停1,并且然后4秒。 我的问题是什么? 甚至有可能使用Kotlin作为Java协程的主干? 如果是这样,我做错了什么? 下面你可以找到显示我如何尝试在Java中使用Kotlin协程的源代码。 KtScript类 abstract class KtScript { abstract fun execute() fun <T> async(block: suspend () -> T): CompletableFuture<T> { val future = CompletableFuture<T>() block.startCoroutine(completion = object : Continuation<T> { override fun […]

序列发生器作为扩展函数调用失败与“接收器类型不匹配”

我正在试图从LongRange前面的一个Long值中生成一个序列。 这工作: val seq = buildSequence<Long> { yield(2) yieldAll(3L..5) } 但试图推广它,我似乎无法构建一个我可以成功调用的扩展函数: infix fun Long.join(R: LongRange): Sequence<Long> { val start = this return buildSequence<Long> { yield(start) yieldAll(R) } } 当我试图调用它时: (2 join 3..5).forEach { /* do something */ } 我明白了 错误:(26,20)Kotlin:未解决的参考。 公共中缀fun Long.join(R:LongRange):在main.kotlin中定义的序列 似乎编译器认识到函数的签名与我正在尝试实现的内容很接近 ,但是我很清楚“接收器类型不匹配”是什么意思。

异步不等待等待

我是Kotlin和协程的新手。 但是我想用它来初始化Android ThreeTen backport库,这是一个长期运行的任务。 我正在使用Metalab Async / Await库( co.metalab.asyncawait:asyncawait:1.0.0 )。 这是我的代码: override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val application = this async { //non-blocking initialize ThreeTen await { AndroidThreeTen.init(application) } //initialize UI on UI thread which uses the ThreeTen library initUI() } } 现在我有初始化UI时库没有初始化的问题。 从我的理解initUI不应该在调用initUI之前调用initUI 。

ArrayBroadcastChannel:第二个订阅者不更新UI

在我的代码中,我有一个ArrayBroadcastChannel将字符串发送给两个订阅者: val dataStream = ArrayBroadcastChannel<String>(1) … launch(viewModelJob + CommonPool) { val reader = BufferedReader(InputStreamReader(bluetoothSocket.inputStream)) while (viewModelJob.isActive) { reader.readLine()?.let { dataStream.send(it) } } } … launch(job + UI) { dataStream.consumeEach { if (it.isNumber()) { val coloredValue = asyncGetColoredValue().await() coloredDots.add(coloredValue) } } dataStream.consumeEach { if (it.isSampleMessage()) { //terminal string view.displayData(coloredDots) //draw a chart view.mainView.displaySnackbar("Sample Analysis Completed") } […]

yield在Maven项目的buildSequence中抛出KotlinNullPointerException

我正在调查Kotlin的coroutines ,从斐波那契序列开始,如下所示: import kotlin.coroutines.experimental.buildSequence fun main(args: Array<String>) { val fibo = buildSequence { yield(0) var a = 0 var b = 1 while (true) { yield(b) b = a + b a = b – a } } fibo.take(5).forEach { println(it) } } 我使用的是IntelliJ IDEA,当上面的代码运行在由New Project – > Kotlin – > Kotlin(JVM)创建的New Project ,它工作正常。 当代码运行在Maven的一个项目中,从archetype […]