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 중국어 웹사이트의 기타 관련 기사를 참조하세요!