Kotlin控制台应用程序在程序退出之前执行所有异步任务的方式

时间:2019-01-22 00:14:05

标签: kotlin

我有一个命令行应用程序,可以执行一些异步任务:

return $this
            ->result($val)
            ->dollars()
            ->format('0,0.00')

我用gradle运行main方法,这里是配置:

class Main {
    companion object {

        @JvmStatic
        fun main(args: Array<String>) {

            GlobalScope.run {
                launch {
                    FetchMovies().execute(7)
                }
            }
        }
    }
} 

所以我运行它:apply plugin: 'application' mainClassName = 'br.com.alessi.parser.main.Main' // optional: add one string per argument you want as the default JVM args applicationDefaultJvmArgs = ["-Xms512m", "-Xmx1g"]

当我运行它时,该程序无法执行异步执行。如何告诉我的程序等到FetchMovie()。execute()完成?

我尝试使用Thread.sleep(),但这当然有点不准确。

---编辑

从协程文档中,我可以这样做:

$ ./gradlew run

但是我不能在非暂停方法中调用job.join(),如果我将main暂停,则无法通过命令行运行。

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用runBlocking,如本示例中的协同程序文档所述。

import kotlinx.coroutines.*

fun main() = runBlocking { // this: CoroutineScope
    launch { // launch new coroutine in the scope of runBlocking
        delay(1000L)
        println("World!")
    }
    println("Hello,")
}

这按以下build.gradle的说明进行工作

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.11'
}
apply plugin: 'application'
mainClassName = "MainKt"
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0'
//    implementation "io.reactivex.rxjava2:rxjava:2.2.5"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
相关问题