>  기사  >  Java  >  Java 다중 스레드 프로그래밍: 스레드 생성, 동기화 및 통신

Java 다중 스레드 프로그래밍: 스레드 생성, 동기화 및 통신

WBOY
WBOY원래의
2023-05-11 19:51:191591검색

Java 다중 스레드 프로그래밍: 스레드 생성, 동기화 및 통신

객체 지향 프로그래밍 언어인 Java는 다중 스레드 프로그래밍을 지원하고 복잡한 다중 작업 동시성 문제를 처리할 수 있습니다. 작업을 동시에 실행하기 위해 프로그램을 여러 실행 스레드로 분해함으로써 Java의 다중 스레드 프로그래밍은 프로그램 성능을 크게 향상시킬 수 있습니다.

Java에서 스레드는 다른 스레드와 메모리 및 기타 리소스를 공유하는 경량 실행 경로입니다. 각 스레드는 자체 작업을 독립적으로 수행하지만 스레드는 동기화와 통신을 통해 리소스를 조정하고 공유할 수 있습니다.

스레드 생성
Java에서 스레드를 생성하는 방법에는 Thread 클래스를 상속하는 것과 Runnable 인터페이스를 구현하는 두 가지 방법이 있습니다.

Thread 클래스 상속 방법:

public class MyThread extends Thread {
    public void run() {
        System.out.println("MyThread is running.");
    }
}

Runnable 인터페이스 구현 방법:

public class MyRunnable implements Runnable{
    public void run(){
        System.out.println("MyRunnable is running.");
    }
}

스레드 시작 방법은 다음과 같습니다.

// 继承Thread类方式
Thread thread1 = new MyThread();
thread1.start();

// 实现Runnable接口方式
Thread thread2 = new Thread(new MyRunnable());
thread2.start();

스레드 동기화
Java 멀티 스레드 프로그래밍에서는 스레드 간의 실행 순서가 다음과 같기 때문입니다. 예측할 수 없으므로 여러 스레드가 동시에 공유 리소스에 액세스하면 데이터 경합 문제가 발생하여 잘못된 프로그램 결과가 발생할 수 있습니다.

스레드 간의 올바른 조정과 데이터 공유를 보장하기 위해 Java에서는 동기화 메커니즘과 객체 잠금이 제공됩니다. 동기화 메커니즘은 동기화된 키워드를 통해 구현되고 잠금 메커니즘은 Java의 잠금 객체를 통해 구현됩니다.

다음은 동기화 키워드를 사용하는 방법입니다.

public class MyCounter {
    private int count;

    public synchronized void increment() {
        count++;
    }
}

위 코드에서 increment() 메서드는 스레드로부터 안전한 메서드입니다. 즉, 한 스레드에서만 이 메서드에 액세스할 수 있습니다. 동시. increment()方法为线程安全方法,即在同一时刻只有一个线程能够访问该方法。

下面是lock对象的使用方式:

public class MyCounter {
    private int count;
    private final Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}

上述代码中,increment()方法同样是线程安全方法,为了保证线程安全,需要先通过lock()方法获得对象锁,然后执行完操作后再释放对象锁。

线程通信
通过线程同步机制可以保证线程安全,但是有些情况下需要线程间的协调和信息交换,这时就需要线程通信机制。线程通信机制包括wait()、notify()和notifyAll()三个方法。

wait()方法使当前线程等待,并将线程的状态设置为等待状态,直到另一个线程使用notify()方法通知或者wait()时间超时。

notify()方法则唤醒一个等待状态的线程,如果有多个线程在等待状态,只能随机选择其中的一个线程唤醒。

notifyAll()方法唤醒所有等待状态的线程,这样多个等待状态的线程就能够同时运行。

下面是线程通信的示例:

public class MyQueue {
    private Queue<String> queue = new LinkedList<>();

    public synchronized void put(String value) {
        queue.add(value);
        notify();
    }

    public synchronized String get() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }
        return queue.remove();
    }
}

上述代码中,put()方法将元素添加到队列中,并使用notify()方法通知等待的线程;get()方法则等待队列中的元素,在元素可获得时使用notify()

다음은 잠금 개체를 사용하는 방법입니다.

rrreee
위 코드에서 increment() 메서드도 스레드로부터 안전한 메서드입니다. pass lock() code> 메소드는 객체 잠금을 획득한 후 작업이 완료된 후 객체 잠금을 해제합니다.

🎜스레드 통신🎜스레드 동기화 메커니즘을 통해 스레드 안전성을 보장할 수 있지만 경우에 따라 스레드 간 조정 및 정보 교환이 필요한 경우 스레드 통신 메커니즘이 필요합니다. 스레드 통신 메커니즘에는 wait(), inform() 및 informAll()의 세 가지 메서드가 포함됩니다. 🎜🎜wait() 메서드는 현재 스레드를 기다리게 하고 다른 스레드가 통지() 메서드를 사용하여 알리거나 wait() 시간이 초과될 때까지 스레드의 상태를 대기 상태로 설정합니다. 🎜🎜notify() 메서드는 대기 상태에 있는 스레드를 깨웁니다. 대기 상태에 있는 스레드가 여러 개인 경우 그 중 하나만 무작위로 선택하여 깨울 수 있습니다. 🎜🎜notifyAll() 메서드는 대기 상태에 있는 모든 스레드를 깨워 대기 상태에 있는 여러 스레드가 동시에 실행될 수 있도록 합니다. 🎜🎜다음은 스레드 통신의 예입니다. 🎜rrreee🎜위 코드에서 put() 메서드는 대기열에 요소를 추가하고 notify()를 사용합니다. 대기 중인 스레드에 알리는 메서드 Thread; get() 메서드는 대기열에 있는 요소를 기다리고 요소가 있을 때 대기 중인 스레드에 알리기 위해 notify() 메서드를 사용합니다. 사용 가능. 🎜🎜결론🎜Java의 다중 스레드 프로그래밍은 프로그램 정확성과 성능을 보장하기 위해 신중한 설계와 구현이 필요한 복잡한 작업입니다. 스레드의 생성, 동기화 및 통신 메커니즘을 이해하면 Java에서 멀티 스레드 프로그래밍의 핵심 사항을 숙지하여 프로그램의 품질과 성능을 향상시키는 데 도움이 됩니다. 🎜

위 내용은 Java 다중 스레드 프로그래밍: 스레드 생성, 동기화 및 통신의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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