>  기사  >  Java  >  Java의 다중 스레드 프로그래밍

Java의 다중 스레드 프로그래밍

王林
王林원래의
2023-06-09 12:13:471654검색

Java의 멀티스레드 프로그래밍

Java는 소프트웨어 개발 분야에서 널리 사용되는 프로그래밍 언어이며, 멀티스레드 프로그래밍은 Java의 일반적인 프로그래밍 패턴입니다. 멀티스레드 프로그래밍을 사용하면 프로그램이 동시에 여러 작업을 수행할 수 있어 프로그램의 동시성과 효율성이 향상됩니다. 이 기사에서는 Java의 다중 스레드 프로그래밍을 소개합니다.

멀티스레딩의 기본 개념

멀티스레딩은 동시에 여러 작업을 수행할 수 있는 프로그램의 능력을 말합니다. 단일 코어 CPU의 경우 CPU가 여러 작업을 빠르게 전환하여 멀티스레딩이 달성됩니다. 멀티 코어 CPU의 경우 여러 작업을 서로 다른 CPU 코어에서 동시에 실행할 수 있습니다.

Java의 멀티 스레딩 구현

Java의 멀티 스레딩은 경량 스레드 구현을 제공하는 Thread 클래스의 객체를 생성하여 구현됩니다. 스레드는 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현하여 생성할 수 있습니다.

  1. Thread 클래스 상속

Thread 클래스를 상속하는 것은 클래스를 생성하고 Thread 클래스를 상속한 다음 run() 메서드를 재정의하여 멀티스레딩 기능을 구현하기만 하면 됩니다. 아래와 같이:

public class MyThread extends Thread {

    @Override
    public void run() {
        // 运行多线程的函数代码
    }
}

MyThread의 객체를 생성하고 start() 메서드를 호출하여 새 스레드를 시작합니다.

MyThread thread = new MyThread();
thread.start();
  1. Runnable 인터페이스 구현

Runnable 인터페이스 구현은 멀티 스레딩을 구현하는 방법이기도 합니다. run() 메소드를 구현해야 하지만 Runnable 인터페이스 인스턴스를 Thread 클래스의 생성자에 전달해야 합니다. 아래와 같이:

public class MyRunnable implements Runnable {

    @Override
    public void run() {
        // 运行多线程函数代码
    }
}

MyRunnable 스레드 생성 및 시작:

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();

Java의 Thread 클래스는 스레드의 상태와 동작을 모니터링하고 제어하기 위한 Join(), Yield()와 같은 몇 가지 다른 메서드와 속성을 제공합니다. , sleep(), setPriority() 및 isAlive() 메소드.

멀티 스레드 동기화

멀티 스레드 프로그래밍에서는 여러 스레드가 동일한 리소스에 액세스할 수 있습니다. 이때, 여러 스레드가 동시에 동일한 리소스를 수정하여 데이터 혼란이나 오류가 발생하는 것을 방지하기 위해 스레드 동기화 및 상호 배제를 보장해야 합니다. Java는 다양한 동기화 방법을 제공합니다.

  1. 동기화 코드 블록

동기화 키워드를 사용하면 메서드나 코드 블록을 동기화됨으로 표시하여 블록에 들어가는 단 하나의 스레드만 해당 코드를 실행할 수 있습니다. 아래와 같이:

public class SynchronizedThread {
    // 定义一个计数器
    private int count = 0;

    // 定义同步的方法
    public synchronized void addCount() {
        count++;
        System.out.println("count = " + count);
    }

    // 定义一个线程类来调用 addCount() 方法
    private static class MyThread extends Thread {
        private SynchronizedThread synchronizedThread;

        public MyThread(SynchronizedThread synchronizedThread) {
            this.synchronizedThread = synchronizedThread;
        }

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                synchronizedThread.addCount();
            }
        }
    }

    public static void main(String[] args) {
        SynchronizedThread synchronizedThread = new SynchronizedThread();
        MyThread thread1 = new MyThread(synchronizedThread);
        MyThread thread2 = new MyThread(synchronizedThread);
        thread1.start();
        thread2.start();
    }
}
  1. 동기화된 메소드

메서드를 동기화됨으로 표시한 후 해당 메소드는 동기화되며 단 하나의 스레드만 입력할 수 있습니다. 예:

public synchronized void addCount() {
    count++;
    System.out.println("count = " + count);
}
  1. Lock 클래스

Lock은 Java의 또 다른 동기화 메커니즘입니다. 보다 유연한 스레드 동기화를 제공하므로 여러 잠금 간 전환이 더 쉬워집니다. Lock은 java.util.concurrent.locks.Lock 인터페이스를 구현하고 다음 메소드를 제공합니다.

  • lock(): 잠금을 얻으려고 시도합니다. 잠금이 이미 사용 중인 경우 스레드는 잠금을 얻을 때까지 기다립니다.
  • unlock(): 잠금을 해제합니다.
  • tryLock(): 잠금을 얻으려고 시도합니다. 잠금이 이미 사용 중인 경우 즉시 false를 반환합니다.
  • newCondition(): 이 잠금과 관련된 Condition 인스턴스를 반환합니다. Condition의 wait() 메서드를 호출하기 전에 스레드는 잠금과 관련된 객체 모니터 잠금을 획득해야 합니다.

예:

Lock lock = new ReentrantLock();

public void addCount() {
    lock.lock();
    try {
        count++;
        System.out.println("count = " + count);
    } finally {
        lock.unlock();
    }
}

Java 스레드 풀

Java의 스레드 풀은 스레드를 관리하고 재사용하기 위한 메커니즘입니다. 스레드 풀은 CPU 성능을 더 잘 활용하고 스레드 생성 및 파괴를 줄이며 프로그램의 응답 속도를 향상시킬 수 있습니다. Java에서는 ThreadPoolExecutor 클래스를 통해 스레드 풀을 생성할 수 있습니다. 스레드 풀 크기, 대기열 길이 등의 매개변수를 지정할 수 있으며 다양한 작업을 수행할 수도 있습니다.

예:

ExecutorService threadPool = Executors.newFixedThreadPool(10);
threadPool.execute(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
});

요약

Java의 다중 스레드 프로그래밍은 프로그램 동시성과 효율성을 향상시키는 중요한 수단입니다. Java에서 멀티 스레드를 생성하는 두 가지 방법(Thread 클래스 상속 및 Runnable 인터페이스 구현)을 소개하는 것 외에도 다양한 동기화 방법과 Java 스레드 풀도 소개합니다. 멀티스레드 프로그래밍의 기본 개념과 구현 방법을 이해하는 것은 효율적이고 동시성 높은 프로그램을 개발하는 데 중요합니다.

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

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