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.