멀티 스레드 애플리케이션 구축에 특히 적합한 프로그래밍 언어인 Java는 멀티 코어 프로세서의 장점을 최대한 활용하여 프로그램 동시성 및 효율성을 향상시킬 수 있습니다. 그러나 멀티스레드 개발 중에는 스레드 간 통신 문제가 주요 과제가 됩니다. 이 기사에서는 스레드 간 통신 문제를 처리하는 몇 가지 일반적인 방법을 소개합니다.
공유 변수는 스레드 간에 통신하는 가장 간단하고 일반적인 방법 중 하나입니다. 여러 스레드는 공유 변수에 액세스하고 수정하여 정보를 전달할 수 있습니다. 그러나 스레드가 병렬로 실행되므로 경쟁 조건이 발생할 수 있습니다. 경쟁 조건을 방지하려면 뮤텍스를 사용하여 공유 변수에 대한 액세스를 보호해야 합니다. 뮤텍스 잠금은 동기화된 키워드 또는 잠금 인터페이스를 사용하여 Java에서 구현할 수 있습니다.
다음은 스레드 통신을 위해 공유변수를 사용하는 샘플 코드입니다.
public class SharedVariableExample { private int sharedVar = 0; public synchronized void increment() { sharedVar++; } public synchronized int getSharedVar() { return sharedVar; } } public class MyThread extends Thread { private SharedVariableExample example; public MyThread(SharedVariableExample example) { this.example = example; } public void run() { for (int i = 0; i < 10; i++) { example.increment(); } } } public class Main { public static void main(String[] args) { SharedVariableExample example = new SharedVariableExample(); MyThread thread1 = new MyThread(example); MyThread thread2 = new MyThread(example); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("SharedVar: " + example.getSharedVar()); } }
위의 예에서 두 스레드는 각각 공유변수에 대해 10번의 증분 연산을 수행하고, 조인( ) 메소드 공유 변수의 값입니다.
스레드 간 통신을 위해 공유 변수를 사용할 때 스레드가 다른 스레드의 결과를 기다려야 하는 경우 대기/알림 메커니즘을 사용할 수 있습니다. 스레드가 대기해야 할 경우 개체의 wait() 메서드를 호출하여 스레드를 대기 상태로 전환할 수 있습니다. 특정 조건이 충족되면 다른 스레드는 개체의 inform() 메서드를 호출하여 대기 중인 스레드를 깨울 수 있습니다.
다음은 스레드 통신을 위한 대기/알림 메커니즘을 사용하는 샘플 코드입니다.
public class WaitNotifyExample { private boolean flag = false; public synchronized void waitForSignal() { while (!flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } flag = false; System.out.println("Received signal"); } public synchronized void sendSignal() { flag = true; notify(); } } public class WaitThread extends Thread { private WaitNotifyExample example; public WaitThread(WaitNotifyExample example) { this.example = example; } public void run() { example.waitForSignal(); } } public class NotifyThread extends Thread { private WaitNotifyExample example; public NotifyThread(WaitNotifyExample example) { this.example = example; } public void run() { example.sendSignal(); } } public class Main { public static void main(String[] args) { WaitNotifyExample example = new WaitNotifyExample(); WaitThread waitThread = new WaitThread(example); NotifyThread notifyThread = new NotifyThread(example); waitThread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } notifyThread.start(); try { waitThread.join(); notifyThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }
위의 예에서 WaitThread 스레드는 신호가 수신될 때까지 기다리고, NotifyThread 스레드는 신호를 보내고, 대기 중인 스레드를 깨웁니다. sleep() 메서드 스레드를 통해 일정 시간 기다린 후 스레드를 실행합니다.
Blocking Queue는 스레드 간 통신을 달성하는 효율적인 방법입니다. 조건이 충족될 때까지 대기열이 가득 차거나 비어 있을 때 자동으로 차단하고 대기할 수 있는 put() 및 take() 메서드를 제공합니다.
다음은 스레드 통신을 위해 차단 대기열을 사용하는 샘플 코드입니다.
import java.util.concurrent.ArrayBlockingQueue;
위 내용은 Java 개발 시 스레드 간 통신 문제를 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!