Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何在工作线程上启动lazy init_Kotlin - Fatal编程技术网

Kotlin 如何在工作线程上启动lazy init

Kotlin 如何在工作线程上启动lazy init,kotlin,Kotlin,我有一个字段val mThing,我通过lazyThing()初始化它。现在,我希望lazyThing()调用需要一些时间,因此我希望在工作线程上启动初始化。显然,如果出现其他线程,需要mThing并等待它,这是可以的,但是我希望尽快在工作线程上启动初始化。在科特林做这件事有什么好看的方法 或者,如果有比惰性初始化更好的模式,我愿意接受建议。您可以在惰性功能中指定同步模式: 最简单的方法是让JVM在类加载时进行初始化。因此,您可以声明一个类或对象,该类或对象包含计算结果字段。接下来,JVM将执

我有一个字段
val mThing
,我通过lazyThing()初始化它。现在,我希望
lazyThing()
调用需要一些时间,因此我希望在工作线程上启动初始化。显然,如果出现其他线程,需要
mThing
并等待它,这是可以的,但是我希望尽快在工作线程上启动初始化。在科特林做这件事有什么好看的方法


或者,如果有比惰性初始化更好的模式,我愿意接受建议。

您可以在
惰性
功能中指定同步模式:

最简单的方法是让JVM在类加载时进行初始化。因此,您可以声明一个类或对象,该类或对象包含计算结果字段。接下来,JVM将执行必要的锁定:

object ComputeValueOnClassLoad {
  val value = lazyThing()
}

第一个工作线程将使用该类,它将初始化类加载,从而计算值。其他线程将等待它

为什么需要工作线程?如果您不关心初始化时线程是否阻塞,那么我想只要初始化是同步的,您就可以简单地运行
lazyThing()
,让线程阻塞。我不知道这个用例,但在Android应用程序中,这通常是非常危险的,在Android应用程序中,您可能会意外地阻止UI线程,而UI线程是无法阻止的。在其他情况下,这可能完全没问题。@Fred worker线程正是出于这个原因。从理论上讲,如果某个依赖于UI的对象需要这个对象,那么我们当然需要等待(我们不会阻止UI线程,但同时可能需要显示一个微调器),因此最好在工作线程上加速初始化。我们可以通过各种方式来实现这一点,但我希望看到一些干净的方法。我想说,使用kotlin委托进行延迟初始化似乎不合适。这些将阻止线程,直到结果可用。语义也要求这样的行为,因为一旦您读取变量,您就期望同步读取结果。事实上,它是惰性初始化的,我想这是一个内部细节。读取一个变量并在它准备好使用之前不阻塞它是很奇怪的。您将返回什么中间值?在这种情况下,我将公开一个worker或调用方知道将运行异步的东西,就像rxjava可观察对象通常所做的那样。