Java’da Inter-thread Communication

sametklou

Java’da Inter-thread Communication

Java programlama dilinde, farklı thread'ler arasında iletişim kurmanın birkaç yolu vardır. Bu yazıda, Java'da inter-thread iletişimi sağlayan yöntemleri inceleyeceğiz ve örneklerle detaylı bir şekilde açıklayacağız.

1. wait() ve notify() Metodları

wait() ve notify() metodları, Java'da inter-thread iletişimi sağlayan en temel yöntemlerden biridir. wait() metodunu kullanan bir thread, belirtilen bir şart gerçekleşene kadar beklemektedir. Bu durum gerçekleştiğinde, diğer thread'ler notify() veya notifyAll() metodunu kullanarak bekleyen thread'i uyandırabilir.

Örnek bir kod parçasıyla bu konuyu daha iyi anlayalım:

public class InterThreadCommunicationExample {
    public static void main(String[] args) {
        final Object lock = new Object();

        Thread producer = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Producer thread is producing data...");
                lock.notify();
            }
        });

        Thread consumer = new Thread(() -> {
            synchronized (lock) {
                try {
                    lock.wait();
                    System.out.println("Consumer thread is consuming data...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        producer.start();
        consumer.start();
    }
}

Yukarıdaki örnekte, wait() ve notify() metodları kullanılarak bir üretici ve tüketici thread arasında iletişim sağlanmaktadır. producer thread'i veri üretirken, consumer thread'i bu veriyi tüketmektedir.

2. BlockingQueue Kullanımı

Java'da inter-thread iletişimi sağlamak için kullanılabilecek bir diğer yöntem ise BlockingQueue yapısıdır. BlockingQueue, thread'ler arasında veri paylaşımını kolaylaştıran bir kuyruk yapısıdır. Bu sayede thread'lerin veri paylaşımı daha güvenli bir şekilde gerçekleştirilebilir.

Örnek bir kod parçasıyla BlockingQueue yapısını kullanarak inter-thread iletişimi sağlayalım:

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

public class BlockingQueueExample {
    public static void main(String[] args) {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

        Thread producer = new Thread(() -> {
            try {
                for (int i = 1; i <= 10; i++) {
                    queue.put(i);
                    System.out.println("Producer produced: " + i);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread consumer = new Thread(() -> {
            try {
                for (int i = 1; i <= 10; i++) {
                    int value = queue.take();
                    System.out.println("Consumer consumed: " + value);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producer.start();
        consumer.start();
    }
}

Bu örnekte, BlockingQueue yapısı kullanılarak bir üretici ve tüketici thread arasında veri paylaşımı sağlanmaktadır.

Java'da inter-thread iletişimi sağlamak için birçok farklı yöntem bulunmaktadır. wait() ve notify() metodları ile birlikte BlockingQueue yapısı, bu amaçla sıkça kullanılan yöntemler arasındadır. Bu yöntemler sayesinde thread'ler arasında güvenli ve etkili bir iletişim kurulabilir.