>Java >java지도 시간 >스레드 인터럽트란 무엇입니까? Java 스레드 중단에 대한 자세한 소개(예제 포함)

스레드 인터럽트란 무엇입니까? Java 스레드 중단에 대한 자세한 소개(예제 포함)

不言
不言앞으로
2018-09-27 16:38:323160검색

이 기사에서는 스레드 중단이란 무엇인지에 대한 내용을 제공합니다. Java 스레드 중단에 대한 자세한 소개는 특정 참조 가치가 있습니다. 도움이 필요한 친구가 참조할 수 있기를 바랍니다.

모두가 아래 깨진 코드를 잘 알고 있어야 합니다. 스레드 절전은 스레드 인터럽트 예외를 포착하거나 발생시켜야 합니다. 즉, 잠자는 동안 누군가 갑자기 달려와 깨워야 합니다.

try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

이때 스레드가 중단된 후에도 코드는 계속 실행되거나 실행을 종료하기 위해 예외가 발생합니다. 이는 우리에게 필요한 중단된 스레드의 역할이 아닙니다.

스레드 중단이란 정확히 무엇인가요?

스레드 중단은 스레드가 실행되는 동안 다른 스레드에 의해 중단된다는 의미입니다. 스레드 중단은 시스템에 의해 강제로 종료되는 반면 스레드 중단은 대상에 인터럽트를 보냅니다. thread.signal, 대상 스레드가 스레드 인터럽트 신호를 수신하지 못하고 스레드를 종료하는 경우 스레드는 종료되지 않거나 다른 논리를 수행할지 여부가 대상 스레드에 의해 결정됩니다.

스레드 중단의 가장 중요한 세 가지 방법을 살펴보겠습니다. 모두 Thread 클래스에서 비롯됩니다!

1, java.lang.Thread#interrupt

대상 스레드를 중단하고 대상 스레드에 인터럽트 신호를 보내고 스레드는 중단됨으로 표시됩니다.

2, java.lang.Thread#isInterrupted()

대상 스레드가 중단되었는지 여부를 결정하고 중단 표시는 중단되지 않습니다. 지워졌습니다.

3, java.lang.Thread#interrupted

대상 스레드가 인터럽트되었는지 확인하기 위해 인터럽트 표시가 지워집니다.

스레드 인터럽트 실제 전투

예제를 통해 스레드 인터럽트 사용법을 보여드리겠습니다!

예제 1(중단 실패)

/**
 * 微信公众号:Java技术栈
 */
private static void test1() {
    Thread thread = new Thread(() -> {
        while (true) {
            Thread.yield();
        }
    });
    thread.start();
    thread.interrupt();
}

예 1의 스레드가 중단됩니까? 답변: 아니요. 인터럽트 신호가 스레드로 전송되지만 프로그램에는 인터럽트 신호에 응답하는 논리가 없으므로 프로그램은 어떤 방식으로도 반응하지 않습니다.

예제 2: (중단 성공)

/**
 * 微信公众号:Java技术栈
 */
private static void test2() {
    Thread thread = new Thread(() -> {
        while (true) {
            Thread.yield();

            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }
        }
    });
    thread.start();
    thread.interrupt();
}

예 2에서는 인터럽트에 응답하는 논리를 추가했으며 프로그램은 인터럽트를 수신하면 인쇄합니다. 인터럽트 신호 메시지를 보낸 후 반환하고 종료합니다.

예 3 (중단 실패)

/**
 * 微信公众号:Java技术栈
 */
private static void test3() throws InterruptedException {
    Thread thread = new Thread(() -> {
        while (true) {
            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                System.out.println("Java技术栈线程休眠被中断,程序退出。");
            }
        }
    });
    thread.start();
    Thread.sleep(2000);
    thread.interrupt();
}

예 3 sleep() 메소드가 중단되어 Java技术栈线程休眠被中断,程序退出。이 출력되었습니다. 계속 달리고 있어요...왜요?

sleep 소스 코드를 보면:

스레드 인터럽트란 무엇입니까? Java 스레드 중단에 대한 자세한 소개(예제 포함)

이라는 것을 알 수 있습니다. sleep() 메서드는 인터럽트 후에 인터럽트 플래그가 지워지므로 루프가 계속 실행됩니다. .

예제 4 (중단 성공)

/**
 * 微信公众号:Java技术栈
 */
private static void test4() throws InterruptedException {
    Thread thread = new Thread(() -> {
        while (true) {
            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                System.out.println("Java技术栈线程休眠被中断,程序退出。");
                Thread.currentThread().interrupt();
            }
        }
    });
    thread.start();
    Thread.sleep(2000);
    thread.interrupt();
}

예제 4 sleep() 메서드가 중단되는 것을 제외하고 모든 정보가 정상적으로 출력되고 종료됩니다. 표시한 후 현재 스레드를 수동으로 다시 중단하면 프로그램이 중단 신호를 수신하고 종료로 돌아갑니다.

위의 4가지 인터럽트 예제를 통해 우리는 자바 스레드 인터럽트의 개념을 포괄적으로 이해했다고 믿습니다.

위 내용은 스레드 인터럽트란 무엇입니까? Java 스레드 중단에 대한 자세한 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제

관련 기사

더보기