поток лямбда-выражения в Kotlin

#java #multithreading #kotlin #java-threads

#java #многопоточность #kotlin #java-потоки

Вопрос:

Пример кода:

 fun main() {
   thread(name = "Worker Thread") {
        for (i in 1..5) {
            println(Thread.currentThread().name)
        }
    }
    println(Thread.currentThread().name)
}
 

Декомпилированный байт-код для приведенного выше примера:

 public final class PracKt {
   public static final void main() {
      ThreadsKt.thread$default(false, false, (ClassLoader)null, "Worker Thread", 0, (Function0)null.INSTANCE, 23, (Object)null);
      Thread var10000 = Thread.currentThread();
      Intrinsics.checkNotNullExpressionValue(var10000, "Thread.currentThread()");
      String var0 = var10000.getName();
      boolean var1 = false;
      System.out.println(var0);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}
 

Код работает нормально, но я не могу понять в декомпилированном коде, как поток выполняется без вызова start() метода. Если я пытаюсь вызвать thread.start() пример кода, генерируется исключение IllegalThreadStateException.

Где вызывается start() метод, если он не показан в декомпилированном коде?

Комментарии:

1. В декомпилированном коде оно находится внутри thread$default .

Ответ №1:

Как это следует из документов Kotlin. Когда вы используете метод thread , созданный поток запускается по умолчанию.

 fun thread(
    start: Boolean = true,
    isDaemon: Boolean = false,
    contextClassLoader: ClassLoader? = null,
    name: String? = null,
    priority: Int = -1,
    block: () -> Unit
): Thread
 

Чтобы запустить его явно, вы должны установить start флаг на false .