코 틀린에 비동기 호출 동기를 확인

AUSER :

나는 몇 가지 작업을 수행하고 비동기 적으로 결과를 반환하는 방법을 포함하고 내가 통제 할 수없는 API를 .... 있습니다. 내 응용 프로그램의 일부에 기적이 메소드를 호출하고 싶습니다. I 클래스 추가하여이 작업을 수행 한 ResultHandler캡처 반환 결과를. 나는 아래에 그것을 한 적이 방식보다이 일을 더 좋은 방법이 있나요? 아마도 표준 코 틀린를 사용하여 (또는 Java 마지막 수단으로) 라이브러리 방법. 내 취향이 될 것 awaitReply을 제거하는 것이 결과를 반환하고 CountdownLatch.

class Main {
    companion object {
        @JvmStatic

        fun main(args: Array<String>) {
            val result1 = Main().nonAsyncMethod1(arrayListOf(1, 2, 3, 4, 5))
            result1.elements.forEach { println(it) }
        }
    }

    class Result1(var elements: Collection<String>)

    fun asyncMethod1(x: Collection<Int>, callback: (Result1) -> Unit) {
        Thread().run {
            // do some calculation
            Thread.sleep(1000)
            callback(Result1(x.map { "\"$it\"" }.toList()))
        }
    }

    private fun nonAsyncMethod1(entities: Collection<Int>): Result1 {
        val resultHandler = ResultHandler<Result1>()

        awaitReply<Result1> {
            asyncMethod1(entities, resultHandler)
        }
        return resultHandler.getResponse()
    }

    open class ResultHandler<T : Any> : (T) -> Unit {
        private lateinit var response: T
        private val latch = CountDownLatch(1)

        override fun invoke(response: T) {
            latch.countDown()
            this.response = response
        }

        fun getResponse(): T {
            latch.await()
            return response
        }
    }

    private fun <T : Any> awaitReply(call: () -> Unit) {
        return call.invoke()
    }
}
AUSER :

the_dani에서 힌트 덕분에

내가 "에 설명 된대로 코 루틴을 사용하여 아래의 솔루션에 와서 관리되는 포장 콜백 "는 코 틀린의 부분은 문서를 코 루틴 :

class Main {
    companion object {
        @JvmStatic

        fun main(args: Array<String>) = runBlocking {
            val result1 = Main().nonAsyncMethod1(arrayListOf(1, 2, 3, 4, 5))
            result1.elements.forEach { println(it) }
        }
    }

    class Result1(var elements: Collection<String>)

    fun asyncMethod1(x: Collection<Int>, callback: (Result1) -> Unit) {
        Thread().run {
            // do some calculation
            Thread.sleep(1000)
            callback(Result1(x.map { "\"$it\"" }.toList()))
        }
    }

    suspend fun nonAsyncMethod1(entities: Collection<Int>): Result1 = suspendCoroutine {
        cont ->
            asyncMethod1(entities) { cont.resume(it) }
    }
}

추천

출처http://43.154.161.224:23101/article/api/json?id=212030&siteId=1