>  기사  >  Java  >  Java 스레드의 5가지 상태와 멀티 스레드 환경에서의 특성 및 성능에 대한 자세한 설명

Java 스레드의 5가지 상태와 멀티 스레드 환경에서의 특성 및 성능에 대한 자세한 설명

WBOY
WBOY원래의
2024-02-18 19:07:05538검색

Java 스레드의 5가지 상태와 멀티 스레드 환경에서의 특성 및 성능에 대한 자세한 설명

Java 스레드의 5가지 상태와 멀티스레드 환경에서의 특성 및 성능을 자세히 설명하세요.

Java는 객체 지향 프로그래밍 언어로 멀티스레딩 기능을 사용하여 동시에 여러 작업을 수행할 수 있습니다. , 프로그램 동시성 및 응답성을 향상시킵니다. Java에서 스레드에는 New, Runnable, Blocked, Waiting 및 Terminating이라는 다섯 가지 상태가 있습니다. 이 기사에서는 이러한 5가지 상태의 특징을 자세히 소개하고 특정 코드 예제를 통해 멀티스레드 환경에서의 성능을 보여줍니다.

1. 새로운 상태(New)
스레드가 생성되었지만 아직 실행을 시작하지 않은 상태를 새로운 상태라고 합니다. 새로 생성된 상태에서는 스레드의 start() 메서드가 아직 호출되지 않았으므로 실제로 실행이 아직 시작되지 않았습니다. 이 시점에서 스레드 개체가 생성되었지만 운영 체제는 여기에 실행 리소스를 할당하지 않았습니다.

2. 실행 가능 상태(Runnable)
start() 메소드에 의해 스레드가 호출된 후 실행 가능 상태로 들어갑니다. 이 상태의 스레드는 CPU를 사용하여 작업을 수행하지만 우선 순위가 높은 다른 스레드, 시간 조각 부족 또는 입력/출력 대기로 인해 일시 중단될 수 있습니다. 실행 가능 상태에서 스레드는 다음과 같은 특징을 갖습니다.

  1. 이 상태의 스레드는 운영 체제 스케줄링의 기본 단위입니다.
  2. 여러 스레드가 동시에 실행되며, 각 스레드에 CPU 타임 슬라이스가 할당되어 교대로 실행됩니다.
  3. 스레드 일정은 운영 체제에 의해 결정되므로 제어할 수 없습니다.

다음은 두 스레드의 실행 가능 상태를 보여주는 간단한 코드 예입니다.

class MyRunnable implements Runnable{
    public void run(){
        for(int i=0; i<10; i++){
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable());
        Thread t2 = new Thread(new MyRunnable());
        
        t1.start();
        t2.start();
    }
}

위 예에서는 두 스레드 t1과 t2를 생성하고 동시에 시작했습니다. 두 스레드가 동시에 실행되므로 출력이 번갈아 나타납니다.

3. 차단된 상태(Blocked)
스레드가 특정 리소스를 얻을 수 없거나 특정 조건이 충족되기를 기다리고 있기 때문에 차단된 상태에 들어갑니다. 차단된 상태의 스레드는 리소스를 얻거나 조건이 충족될 때 실행 가능 상태가 될 때까지 CPU 시간을 소비하지 않습니다.

다음은 스레드의 차단 상태를 보여주는 간단한 코드 예입니다.

public class Main {
    public static void main(String[] args) {
        Object lock = new Object();
        
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread 1 is waiting");
                    lock.wait();
                    System.out.println("Thread 1 is running again");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                Thread.sleep(2000);
                
                synchronized (lock) {
                    System.out.println("Thread 2 is waking up Thread 1");
                    lock.notify();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        t1.start();
        t2.start();
    }
}

위의 예에서 우리는 두 개의 스레드 t1과 t2를 생성했습니다. t1은 t2가 깨어날 때까지 실행 상태 동안 wait() 메서드를 호출하여 대기 상태로 들어갑니다. inform() 메소드를 통해. 여기서 t1이 차단된 이유는 t2가 알림을 발행할 때까지 실행을 계속할 수 없기 때문입니다. t2가 알림을 보내면 t1은 차단을 해제하고 실행 가능 상태로 다시 들어갑니다.

4. 대기 상태(Waiting)
스레드는 다른 스레드가 특정 작업을 수행할 때까지 기다려야 하기 때문에 대기 상태에 들어갑니다. 대기 상태의 스레드는 알림을 받거나 중단될 때까지 기다립니다.

다음은 스레드의 대기 상태를 보여주는 간단한 코드 예시입니다.

public class Main {
    public static void main(String[] args) {
        Object lock = new Object();
        
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread 1 is waiting");
                try {
                    lock.wait(); // 进入等待状态
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                System.out.println("Thread 1 is running again");
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                Thread.sleep(2000);
                
                synchronized (lock) {
                    System.out.println("Thread 2 is waking up Thread 1");
                    lock.notify(); // 唤醒等待的线程
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        t1.start();
        t2.start();
    }
}

위 예시에서는 t2 스레드가 lock.notify를 통과할 때까지 lock.wait() 메서드를 통해 t1 스레드를 대기 상태로 전환합니다. ( ) 방법으로 이를 통지합니다.

5. 종료된 상태(Terminating)
스레드가 작업을 완료하거나 예외로 인해 종료되면 종료된 상태로 들어갑니다. 종료된 상태의 스레드는 더 이상 실행되지 않으며 다시 시작할 수 없습니다.

다음은 스레드 종료 상태를 보여주는 간단한 코드 예제입니다.

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            for(int i=0; i<10; i++){
                System.out.println(Thread.currentThread().getName() + ": " + i);
            }
        });
        
        t1.start();
        
        try {
            t1.join(); // 确保线程执行完
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("Thread 1 is terminated");
    }
}

위 예제에서는 스레드 t1을 생성하고 시작했습니다. 그런 다음 t1.join() 메서드를 사용하여 스레드가 실행을 마친 후에도 후속 코드를 계속 실행하는지 확인합니다.

요약하자면 이 기사에서는 Java 스레드의 5가지 상태와 멀티 스레드 환경에서의 특성 및 성능을 소개합니다. 다중 스레드 프로그래밍의 경우 스레드 상태의 전환과 특성을 이해하는 것이 중요합니다. 적절한 스레드 상태를 사용하면 프로그램을 더욱 효율적이고 안정적으로 만들 수 있습니다. 이 기사의 소개를 통해 독자들이 Java 스레드의 작동 메커니즘을 더 잘 이해하고 실제 프로젝트에서 멀티 스레드 프로그래밍을 올바르게 사용할 수 있기를 바랍니다.

위 내용은 Java 스레드의 5가지 상태와 멀티 스레드 환경에서의 특성 및 성능에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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