>  기사  >  Java  >  Java 멀티스레드 통신 방식 분석

Java 멀티스레드 통신 방식 분석

WBOY
WBOY원래의
2024-04-12 08:18:01320검색

Java에서는 다중 스레드 통신 방법에는 공유 변수, 대기/알림, 세마포어 및 파이프가 포함됩니다. 공유 변수는 데이터 교환을 용이하게 하지만 동시성 문제가 발생하기 쉽습니다. 대기/알림은 동기화 메커니즘을 사용하여 동시에 리소스에 액세스하는 스레드 수를 제한합니다. 파이프는 스레드 간에 데이터를 전송하기 위해 버퍼를 사용합니다.

Java 멀티스레드 통신 방식 분석

Java 멀티스레드 통신 분석

소개

멀티스레딩은 여러 작업을 동시에 실행할 수 있는 동시 프로그래밍의 중요한 개념입니다. 멀티스레드 환경에서 데이터 교환을 구현하기 위해서는 다양한 통신 방식을 이해해야 합니다. 이 기사에서는 공유 변수, 대기/알림, 세마포어 및 파이프를 포함하여 Java의 일반적인 다중 스레드 통신 방법을 심층적으로 살펴보겠습니다.

공유 변수

공유 변수는 여러 스레드에서 액세스할 수 있는 전역 변수입니다. 한 스레드가 공유 변수를 수정하면 다른 스레드가 변경 사항을 볼 수 있습니다. 그러나 공유 변수는 경쟁 조건 및 예측할 수 없는 동작과 같은 동시성 문제가 발생하기 쉽습니다.

실용 사례:

public class SharedVariableExample {
    private static int sharedCounter = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                sharedCounter++;
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                sharedCounter--;
            }
        });

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("最终共享计数器:" + sharedCounter);
    }
}

wait/notify

wait/notify는 Java에 내장된 동기화 메커니즘입니다. wait() 메소드는 다른 스레드가 inform() 또는 informAll() 메소드를 호출하여 깨어날 때까지 현재 스레드를 대기 상태로 전환합니다.

실용 사례:

public class WaitNotifyExample {
    private static Object lock = new Object();

    private static boolean dataAvailable = false;

    public static void main(String[] args) throws InterruptedException {
        Thread producer = new Thread(() -> {
            synchronized (lock) {
                while (!dataAvailable) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                System.out.println("处理数据...");
            }
        });

        Thread consumer = new Thread(() -> {
            synchronized (lock) {
                dataAvailable = true;
                lock.notify();
            }
        });

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

        producer.join();
        consumer.join();
    }
}

세마포

세마포는 특정 수의 스레드가 동시에 리소스에 액세스할 수 있도록 하는 동기화 메커니즘입니다. 스레드가 세마포어를 획득하면 세마포어 카운터가 감소하고, 세마포어를 해제하면 카운터가 증가합니다.

실용 사례:

public class SemaphoreExample {
    private static Semaphore semaphore = new Semaphore(2);

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("线程 1 进入临界区");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("线程 2 进入临界区");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        });

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();
    }
}

Pipeline

Pipeline은 스레드 간 통신에 사용되는 특수 데이터 구조입니다. 이는 버퍼와 같습니다. 한 스레드는 데이터를 쓸 수 있고 다른 스레드는 데이터를 읽을 수 있습니다.

실제 사례:

public class PipeExample {
    private static PipedOutputStream pos = new PipedOutputStream();
    private static PipedInputStream pis = new PipedInputStream(pos);

    public static void main(String[] args) throws IOException {
        Thread writer = new Thread(() -> {
            try {
                pos.write("你好,世界!".getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                pos.close();
            }
        });

        Thread reader = new Thread(() -> {
            try {
                byte[] data = new byte[1024];
                int length = pis.read(data);
                System.out.println(new String(data, 0, length));
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                pis.close();
            }
        });

        writer.start();
        reader.start();

        writer.join();
        reader.join();
    }
}

위 내용은 Java 멀티스레드 통신 방식 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.