Jak przekazać obiekt z jednego wątku do drugiego w Javie?

W programowaniu wielowątkowym często zachodzi potrzeba przekazania danych między różnymi wątkami. Java zapewnia kilka mechanizmów umożliwiających bezpieczne i efektywne przekazywanie obiektów między wątkami. W tej lekcji omówimy jedną z metod, używając prostego przykładu.

Kompletny przykład przekazywania obiektów między wątkami

Zakładając, że mamy obiekt, który chcemy bezpiecznie przekazać z wątku produkującego do wątku konsumującego, możemy użyć klasy ArrayBlockingQueue z pakietu java.util.concurrent. Jest to kolekcja służąca do przechowywania elementów przygotowanych do przekazywania między wątkami, gwarantująca bezpieczeństwo wątków oraz opcjonalne ograniczenie pojemności.

Poniżej znajduje się przykład, jak można zaimplementować takie rozwiązanie:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ThreadCommunication {
    // Kolejka blokująca przechowująca obiekty String
    private BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);

    // Wątek produkujący, który dodaje elementy do kolejki
    private Thread producer = new Thread(() -> {
        for (int i = 0; i < 10; i++) {
            try {
                // Przygotowanie wiadomości do przekazania
                String message = "Wiadomość " + i;
                queue.put(message); // Umieszczanie wiadomości w kolejce
                System.out.println("Producent wysłał: " + message);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    });

    // Wątek konsumujący, który pobiera elementy z kolejki
    private Thread consumer = new Thread(() -> {
        try {
            while (!Thread.interrupted()) {
                // Pobieranie i wyświetlanie wiadomości z kolejki
                String message = queue.take();
                System.out.println("Konsument otrzymał: " + message);
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    });

    public void start() {
        producer.start(); // Uruchomienie wątku produkującego
        consumer.start(); // Uruchomienie wątku konsumującego
    }
    
    public static void main(String[] args) {
        new ThreadCommunication().start();
    }
}

Omówienie kodu

W powyższym przykładzie stworzyliśmy dwie klasy wewnętrzne reprezentujące wątki: psroducenta i konsumenta. Producent dodaje kolejne wiadomości do wspólnej, blokującej kolejki, a konsument je z niej pobiera. ArrayBlockingQueue automatycznie zarządza blokadami, więc jeśli kolejka jest pusta, wątek konsumujący zostanie zablokowany do czasu pojawienia się nowych elementów.

Podsumowanie

Przekazywanie obiektów między wątkami w Javie można efektywnie zrealizować za pomocą kolekcji z pakietu java.util.concurrent, takich jak ArrayBlockingQueue. Dzięki temu mechanizmowi możemy bezpiecznie i płynnie przekazywać dane między wątkami, unikając problemów związanych z dostępem do współdzielonych zasobów.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.

Scroll to Top