#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
.