Java 21 – Virtual Threads Nedir? Virtual Threads Uygulama Örneği
Java 21 ile gelen yeni özelliklerden biri olan Virtual Threads’in ne olduğunu inceleyeceğiz.
Problem?
Virtual Thread’in ne olduğunu anlamak için klasik yöntemde thread nasıl çalışır kısaca bakalım. Bir programımız çalıştığında bir işlem parçacığı işleme alınır ve işlem parçacığı bitene kadar meşgul olur. Bu sorunu aşmak için tabiki farklı yaklaşımlarımız bulunmaktadır. Bir threadde bir işlem yapıyoruz. Asenkron yapı ile birlikte bunu aşıyoruz ancak bu sefer de karşımıza okuması, yazması, debug edilmesi zor bir yapıya dönüşüyor. Birden fazla işlem yaptığımızda ise işletim sistemi seviyesinde her işlem için her birine bir thread açmamız gerekmektedir. Bu ise donanım kaynaklarını çok fazla tüketmemiz anlamına gelmektedir.
Çözüm
Virtual Thread sayesinde ise bir threadin içerisinde birden fazla threadin çalışmasını sağlamaktadır. İşletim sistemi seviyesinde yine bir threadimiz var ancak JVM tarafında o threadin içerisinde birden fazla thread olabiliyor ve bu sayede donanım kaynaklarını görece daha az kullanabilme threadlerimizi daha kolay yönetebilme ve görece daha az asenkron yaklaşımından uzaklaşıp kodlamayı daha da kolaylaştıracağı anlamına gelmektedir.
Virtual Thread’ler JVM tarafınndan yönetildiği için işletim sistemi üzerindeki threadlerin bloklanmaması anlamına gelmektedir. Virtual Thread oluşturmanın maliyeti çok ucuz. Dağıtık olarak çalışırlar ve bir öncelik sırasına koyamayız. Burada unutmamız gereken nokta Virtual Thread’ler Deamon Thread olarak çalışmasıdır.
Performans Karşılaştırması
Bir kod örneği yaparak ikisinin arasındaki farkı anlamaya çalışalım. Yapacağım örnekte bir döngü içerisinde karesini alan bir uygulama yapacağım. Döngü limiti 4000 olacak.
Thread Örnek
public class Main {
public static void main(String[] args) {
try (ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread::new)) {
long startTime = System.nanoTime();
for (int j = 0; j < 4000; j++) {
int square = j;
executor.submit(() -> {
try {
Thread.sleep(1000);
int result = square * square;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
long elapsedTime = System.nanoTime() - startTime;
System.out.println("Thread Toplam geçen süre (milisaniye): " + TimeUnit.NANOSECONDS.toMillis(elapsedTime));
}
}
Code language: Java (java)
Virtual Thread Örnek
public class Main {
public static void main(String[] args) {
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
long startTime = System.nanoTime();
for (int j = 0; j < 4000; j++) {
int square = j;
executor.submit(() -> {
try {
Thread.sleep(1000);
int result = square * square;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
long elapsedTime = System.nanoTime() - startTime;
System.out.println("Virtual Thread Toplam geçen süre (milisaniye): " + TimeUnit.NANOSECONDS.toMillis(elapsedTime));
}
}
}
Code language: Java (java)
Sonuç
Thread Toplam geçen süre (milisaniye): 224
Virtual Thread Toplam geçen süre (milisaniye): 12
No Comment! Be the first one.