Java Academy · Ders

Platform ve Sanal İş Parçacıkları

Her birinin uygun olduğu durumlar

3. ders / 413 adım

Platform ve Sanal İş Parçacıkları, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

İki İş Parçacığı Türü

Java'da artık iki iş parçacığı türü vardır. Platform iş parçacıkları, OS iş parçacıklarının klasik sarmalayıcılarıdır. Sanal iş parçacıkları ise hafiftir ve JVM tarafından yönetilir.

Her birine ne zaman başvuracağınızı bilmek, ölçeklenebilir eşzamanlı Java kodu yazmanın temelidir.

Platform İş Parçacığı Oluşturma

Platform iş parçacığını, Thread.ofVirtual() yönteminin karşılığı olan Thread.ofPlatform() ile oluşturursunuz.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread p = Thread.ofPlatform().name("native-worker").start(() ->
            System.out.println("Platform? " + !Thread.currentThread().isVirtual()));
        p.join();
    }
}

Maliyet Karşılaştırması

Platform iş parçacıkları ağırdır:

  • Her biri için yaklaşık 1 MB yığın alanı ayrılır
  • Oluşturulmaları yavaştır
  • Birkaç binle sınırlıdırlar

Sanal iş parçacıkları ucuzdur: başlangıç yığınları küçüktür, hızlı oluşturulurlar ve milyonlarcası mümkün olabilir.

G/Ç Ağırlıklı İşler

Göreviniz zamanının çoğunu ağda, diskte veya veritabanında bekleyerek geçiriyorsa sanal iş parçacıkları büyük avantaj sağlar.

Bir sanal iş parçacığı engellendiğinde taşıyıcısı serbest kalır ve diğerlerini çalıştırabilir; böylece az sayıda OS iş parçacığı binlerce isteğe hizmet eder.

İşlemci Ağırlıklı İşler

Hiç engellenmeyen saf hesaplamalarda sanal iş parçacıkları hız artışı sağlamaz. Çekirdek sayınızla sınırlısınızdır.

Bu durumda işlemci sayısına göre boyutlandırılmış sabit bir havuz doğru araçtır.

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        int cores = Runtime.getRuntime().availableProcessors();
        try (ExecutorService cpu = Executors.newFixedThreadPool(cores)) {
            Future<Long> f = cpu.submit(() -> {
                long s = 0;
                for (long i = 0; i < 1_000_000L; i++) s += i;
                return s;
            });
            System.out.println("Cores: " + cores + ", sum: " + f.get());
        }
    }
}

Engellenmeyi Benzetme

Bu kod parçası, birçok sanal iş parçacığının aynı anda uyumasını gösterir; bu, engelleyici G/Ç işlemlerinin yerine geçer. Aynı şeyi 10.000 platform iş parçacığının yaptığını hayal etmeye çalışın.

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) {
        AtomicInteger done = new AtomicInteger();
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 0; i < 10_000; i++) {
                exec.submit(() -> {
                    try { Thread.sleep(50); } catch (InterruptedException e) {}
                    done.incrementAndGet();
                });
            }
        }
        System.out.println("Finished blocking tasks: " + done.get());
    }
}

Artalan Durumu

Sanal iş parçacıkları her zaman artalan iş parçacıklarıdır ve artalan olmayan iş parçacıklarına dönüştürülemezler. Platform iş parçacıkları varsayılan olarak oluşturucularının artalan durumunu devralır, ancak bu durum açıkça da ayarlanabilir.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread v = Thread.ofVirtual().unstarted(() -> {});
        Thread p = Thread.ofPlatform().unstarted(() -> {});
        System.out.println("virtual daemon: " + v.isDaemon());
        System.out.println("platform daemon: " + p.isDaemon());
    }
}

Öncelikler Yok Sayılır

Sanal iş parçacıkları her zaman NORM_PRIORITY önceliğini bildirir ve öncelik ayarlamanın hiçbir etkisi yoktur. Zamanlama OS zamanlayıcısı tarafından değil, JVM tarafından yapılır.

public class Main {
    public static void main(String[] args) {
        Thread v = Thread.ofVirtual().unstarted(() -> {});
        v.setPriority(Thread.MAX_PRIORITY);
        System.out.println("Priority is still: " + v.getPriority());
    }
}

Karar Kılavuzu

Pratik bir genel kural:

  • G/Ç işlemlerinde bekleyen çok sayıda görev mi var? Sanal iş parçacıklarını kullanın.
  • İşlemciyle sınırlı yoğun hesaplamalar mı var? Platform iş parçacıklarından oluşan sabit bir havuz kullanın.
  • OS düzeyinde iş parçacığı ayarlarına (öncelik, işlemci yakınlığı) mı ihtiyacınız var? Platform iş parçacıklarını kullanın.

Birlikte Var Olabilirler

Tüm program için birini seçmek zorunda değilsiniz. Tipik bir uygulama, istekleri işlemek için sanal iş parçacıklarını ve işlemciyi yoğun kullanan bölümler için küçük bir platform iş parçacığı havuzunu kullanır.

Her ikisi de aynı Thread API'sini paylaştığından bunları birlikte kullanmak sorunsuzdur.

Geçiş İpucu

G/Ç ağırlıklı bir hizmeti taşırken yapılacak en küçük değişiklik yürütücüyü değiştirmektir: sabit veya önbelleğe alınmış havuzu newVirtualThreadPerTaskExecutor() ile değiştirin.

Yalnızca sabitleme ve ThreadLocal kullanımındaki aşırılıklar konusunda dikkatli olun; bunlar sonraki derste ele alınacaktır.

Hızlı Kontrol

Sanal iş parçacıklarının en belirgin faydayı sağladığı iş yükünü seçin.

Özet

İki iş parçacığı modelini karşılaştırdınız:

  • Platform iş parçacıkları: ağırdır, OS desteklidir; işlemciye bağlı işler ve OS ayarları için en uygundur
  • Sanal iş parçacıkları: ucuzdur, JVM tarafından yönetilir, her zaman artalan iş parçacığıdır; G/Ç ağırlıklı eşzamanlılık için en uygundur
  • Birlikte var olabilir ve aynı API'yi paylaşabilirler

Sırada: sabitlemenin ve ThreadLocals kullanımının sakıncaları var.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Java öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
104
Dersler
374

Sıkça Sorulan Sorular

“Platform ve Sanal İş Parçacıkları” dersi ücretsiz mi?

Evet — “Platform ve Sanal İş Parçacıkları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Platform ve Sanal İş Parçacıkları” dersinde ne öğreneceğim?

Her birinin uygun olduğu durumlar Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Platform ve Sanal İş Parçacıkları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Sanal İş Parçacıkları Nedir
  2. Sanal İş Parçacıkları Oluşturma
  3. Platform ve Sanal İş Parçacıkları
  4. Tuzaklar: Sabitleme ve ThreadLocals
← Java Academy Sayfasına Dön