
Finalmente estamos colhendo os primeiros resultados do Project Loom, trazendo Virtual Threads para a JVM. Virtual threads são threas controlados pelo Java Runtime, em oposição aos Platform Threads que dependem de threads do sistema operacional.
Threads de runtime Java geralmente são correspondentes à threads do kernel do sistema (one-to-one), e o thread scheduler do kernel do sistema é responsável pelo agendamento das threads Java.

O modelo acima era até então o modelo multithreading que utilizamos para resolver problemas de programação concorrente. Mas temos dois problemas centrais com as threads da máquina: são caras e têm um número limitado.
Sendo threads do sistema operacional, elas são caras para criar, tanto em tempo quanto em consumo de recursos. É por isso que você só pode ter tantos deles antes de ficar sem recursos. E quando uma plataform thread é bloqueada, a thread do sistema operacional também é bloqueada, sendo assim nenhum outro código pode ser executado na thread do sistema operacional durante o período de bloqueio.
Virtual threads chegaram para resolver esse problema. A thread que usamos até agora é chamada de platform thread que ainda corresponde à thread do kernel do sistema (aquela one-to-one). Um grande número (M) de virtual threads é executado em um número menor (N) de platform threads (programação M:N).

Multiplos virtual threads serão scheduled pela JVM para execução em um determinado encadeamento de plataforma e um platform thread executará apenas uma virtual thread ao mesmo tempo.
Ou seja, o Java 19 apresenta uma prévia de uma alternativa que deve melhorar drasticamente o manuseio de operações simultâneas por servidores.
Criando Virtual Threads! – Exemplos de uso:
Novas APIs para criar virtual e platform threads:
Thread.ofVirtual() e Thread.ofPlatform()

Thread.startVirtualThread(Runnable) Cria e faz start da thread:

Thread.isVirtual()
determina se é uma virtual thread:

Thread.join
e Thread.sleep
esperam pelo fim da virtual thread e a coloca para dormir:

Executors.newVirtualThreadPerTaskExecutor()
cria um ExecutorService
que criará uma nova thread virtual para cada task:

Web servers
Como você pode ver, apenas usamos um método diferente para indicar que tipo de thread gostaríamos de criar. A partir daí, não há diferença em como você as usa. Servidores da Web como Tomcat ou Jetty não serão diferentes para você ao usá-los.
A Oracle está desenvolvendo também uma nova versão de seu próprio framework de microsserviços Helidon que utiliza virtual threads.
Pra finalizar…
Embora as Virtual Threads tragam enormes melhorias, atualmente não são destinadas a todos os casos de uso. Especialmente as tarefas com uso intensivo de CPU não se beneficiarão tanto da escalabilidade aprimorada, pois tendem a bloquear menos. Também vale a pena mencionar que o código que usa muitos blocos sincronizados para limitar o acesso simultâneo ao código deve ser reescrito em ReentrantLocks.
Espero que tenham gostado, obrigado por ler.
🙂
Vou continuar com mais novidades do Java no próximo post.
referencias:
https://medium.com/javarevisited/how-to-use-java-19-virtual-threads-c16a32bad5f7
Leave a Reply