Skip to content

Instantly share code, notes, and snippets.

@bananaumai
Last active March 24, 2022 23:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bananaumai/da23494ed2ba1d22c39af23a7c07ba2f to your computer and use it in GitHub Desktop.
Save bananaumai/da23494ed2ba1d22c39af23a7c07ba2f to your computer and use it in GitHub Desktop.
Coroutines delay and Future get
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.concurrent.CompletableFuture
fun main() {
val future = CompletableFuture<Unit>()
doSuspend {
println("called")
future.complete(Unit)
}
future.get()
println("complete")
}
fun doSuspend(callback: () -> Unit) {
CoroutineScope(Job()).launch {
println("call callback in 100ms")
delay(100)
println("call callback now")
callback()
}
}
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.concurrent.CompletableFuture
class MainActivity : AppCompatActivity() {
companion object {
private const val TAG = "MainActivity"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val future = CompletableFuture<Unit>()
doSuspend {
Log.d(TAG, "called")
future.complete(Unit)
}
future.get()
Log.d(TAG, "complete")
}
private fun doSuspend(callback: () -> Unit) {
CoroutineScope(Job()).launch {
Log.d(TAG, "call callback in 100ms")
delay(100)
Log.d(TAG, "call callback now")
callback()
}
}
}
@bananaumai
Copy link
Author

bananaumai commented Mar 24, 2022

In Android code (MainActivity.kt), when doSuspend with future will block forever when get() is called. Particularly, inside doSuspend function, delay suspend function never completes.

Meanwhile, on generic JVM environment, the same code can stop.

@bananaumai
Copy link
Author

This issue looks specific to coroutines v1.6.0. It's not reproduced with v1.5.3. Also this issue might be related the bug in 1.6.0 which could be fixed by this PR.

Kotlin/kotlinx.coroutines#3131

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment