Сабже. Или корутины, если вы вдруг котлинист. Разница с корутинами только в том, что в Котлине - это генерация байткода, а в жабе - это хак 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, вы были хорошим источником вдохновения.






