Centrum wiedzy o technologiach i pracy w IT
java yield

Yield w Javie. Jak poprawić wydajność wielowątkową?

Ostatnia aktualizacja 7 listopada, 2023

Programowanie wielowątkowe otwiera szerokie możliwości dla równoczesnego wykonywania wielu operacji. Jednak wraz ze zwiększającym się poziomem skomplikowania kodu, zarządzanie wieloma wątkami pracującymi jednocześnie wymaga od programistów znajomości specjalistycznych technik. W kontekście języka Java, metoda yield klasy Thread jest jednym z bardziej interesujących narzędzi. Pozwala ona na subtelne wpływanie na sposób zarządzania wątkami przez planistę (ang. thread scheduler). Jak z tego korzystać? Poniżej podajemy przykład kodu i wyjaśniamy jego znaczenie.

Nie udało się zapisać Twojej subskrypcji. Spróbuj ponownie.
Udało się! Widzimy się niebawem – newsletter wysyłamy w każdy wtorek

Otrzymuj za darmo unikalne poradniki, dane i wiedzę o pracy w IT – dostarczane co tydzień

Klikając “Zapisz mnie” wyrażasz zgodę na otrzymywanie e-maili od redakcji, a także ofert partnerów oraz akceptujesz naszą Politykę prywatności.

Java yield, czyli odstąpienie pierwszeństwa

Metoda yield jest narzędziem pozwalającym na lepsze wykorzystanie czasu procesora, zwłaszcza gdy działamy na wielu wątkach o tej samej ważności. W momencie wywołania, yield komunikuje planiście wątków, że nie musi on być dłużej wykonywany i inne wątki mogą dostać szansę na działanie. Dzięki temu można ich użyć do poprawy wydajności aplikacji poprzez zapewnienie bardziej równomiernego podziału czasu procesora pomiędzy wątki.

Oto prosty przykład wykorzystania metody yield:

class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 5 ; i++) {
            System.out.println(Thread.currentThread().getName() + " w iteracji " + i);
            Thread.yield();
        }
    }
}

public class YieldDemo {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        
        t1.start();
        t2.start();
    }
}

W tym przykładzie tworzymy dwie instancje MyThread, a każda z nich uruchamia pętlę wykonywaną pięciokrotnie. Przy każdej iteracji wątek wywołuje metodę yield, co sugeruje planiście wątków, że może on przełączyć się na inny wątek o tej samej ważności.

Poprawa wydajności dzięki Thread.yield() zależy od konkretnej implementacji maszyny wirtualnej oraz sprzętu. Jednakże jej świadome używanie może przyczynić się do zwiększenia reaktywności i wydajności aplikacji wielowątkowych.

Dalsza część tekstu znajduje się pod materiałem wideo:

Kiedy używać yield?

Odpowiednie zastosowanie metody yield może przyczynić się do bardziej efektywnego wykorzystania zasobów systemowych. Jest to ważne zwłaszcza w środowisku, w którym wiele wątków o podobnym priorytecie rywalizuje o uwagę procesora. Jest to subtelna i nieco enigmatyczna część API Javy, gdyż jej zachowanie może być różne w zależności od implementacji maszyny wirtualnej Javy oraz od platformy sprzętowej.

To swoista forma “uprzejmości” w wątku, który może, ale nie musi być wzięty pod uwagę przez planistę wątków. Warto pamiętać, że nie gwarantuje to natychmiastowego przełączenia kontekstu.

Ponadto metoda yield jest szczególnie użyteczna, gdy chcemy dać szansę innym wątkom na wykonanie zadania, jeśli wątek aktualnie wykonujący pracę doszedł do punktu, w którym na chwilę przestać być aktywny.

Czytaj także:

Junior Java Developer to dobry kierunek dla początkujących programistów

Java Developer – kim jest i ile zarabia

Total
0
Shares
_podobne artykuły