Сабже. Или корутины, если вы вдруг котлинист. Разница с корутинами только в том, что в Котлине - это генерация байткода, а в жабе - это хак JVM
И называются они Файберы. Почему не корутины? Потому что «файберы» - красивей и короче)
Файберы строятся на континуациях, которые можно прерывать.
public class Continuation implements Runnable {
public Continuation(ContinuationScope scope, Runnable body);
public final void run();
public static void yield(ContinuationScope scope);
public boolean isDone();
protected void onPinned(Reason reason) {
throw new IllegalStateException("Pinned: " + reason);
}
}
и используются они как-то так:
Continuation cont = new Continuation(SCOPE, () -> {
while (true) {
System.out.println("before");
Continuation.yield(SCOPE);
System.out.println("after");
}
});
while (!cont.isDone()) {
cont.run();
}
Соответственно, файберы реализованы поверх них как
Fiber f = Fiber.execute( () -> {
System.out.println("Good Morning!");
readLock.lock();
try {
System.out.println("Good Afternoon");
} finally {
readLock.unlock();
}
System.out.println("Good Night");
});
Внутри файбера соответственно, есть континуация - одна штука, и планировщик - 1 одна штука (общий для всех файберов).
Планировщик берет файбер, выколупывает из него континуацию, и кладёт для выполнения на какой-то реальный нативный тред в ОС.
Суперподробное объяснение я сделал по вот этой ссылке. Есть обычный видеокаст, есть его текстовая расшифровка.
Выводы: Java скоро станет ещё быстрей, чем раньше, и разорвёт всех в пух и прах. Помянем Golang и Nodejs, вы были хорошим источником вдохновения.