Java 19 – Virtual Threads (JEP 425 preview – Como usar?!)

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

Published by Ivan Marrêta

Software Engineer

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: