簡體   English   中英

如何在kotlin中從線程中提取返回值

[英]How to extract return value from Thread in kotlin

假設我有一個函數,可以在其中發送 http 請求並獲取結果。 顯然,我在里面有一些等待:

fun getDocuments(): JsonObject {
        Thread {
            return@Thread functionToGetHttpResultAsJsonObject()
        }.start()
    }

我需要的是將 functionToGetHttpResultAsJsonObject() 的返回值提取到 getDocuments() 返回值中。 但是我得到了 Unit 而不是我想要的 JsonObject。 任何幫助將不勝感激

讓我們開始說你的要求有點奇怪。 您通常不會旋轉線程來阻止主線程等待它完成。 線程的要點是不要那樣做。

沒有簡單的方法可以在線程之間傳遞信息。

如果你想等待一個線程在另一個線程內完成,你應該調用.join()而不是.start()

但這不會返回任何東西。 如果要同步兩個線程。 因此,一個等待另一個計算一些數據並獲取該數據,一種方法是使用BlockingQueue

val queue = LinkedBlockingQueue<Int>()

Thread {
    println("concurrency ftw")
    Thread.sleep(1_000)
    println("finish sleeping!")
    queue.add(1)
}.start()

println("first")
println(queue.take())

注意我在這里使用.start()是因為我不想阻塞第二個線程來完成它的處理。

主線程將在.take.take直到有人添加一些數據。 同時,如果第二個線程首先到達.add它也會阻塞,直到有人使用該數據。

在這一點上我還應該提到 Kotlin 有協程的概念。 它們在概念上與 Go 的“通道”非常相似,我建議也研究這些

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM