java.lang은 무엇을 하는가.스레드.인터럽트()가?
무슨 일이 있었는지 설명해 주시겠습니까?java.lang.Thread.interrupt()
언제 호출되나?
Thread.interrupt()
대상 스레드의 중단 상태/중단 상태를 설정하십시오.그런 다음 대상 스레드에서 실행 중인 코드가 중단된 상태를 폴링하여 적절하게 처리할 수 있다.다음과 같이 차단하는 일부 방법Object.wait()
중단 상태를 즉시 소비하고 적절한 예외를 발생시킬 수 있음(일반적으로)InterruptedException
)
자바에서의 중단은 선제적이지 않다.인터럽트를 올바르게 처리하기 위해 두 나사산이 서로 협력해야 하는 다른 방법을 사용하십시오.대상 스레드가 중단 상태를 폴링하지 않으면 인터럽트가 효과적으로 무시된다.
폴링은 다음을 통해 수행됨Thread.interrupted()
현재 스레드의 중단 상태를 반환하고 해당 중단 플래그를 지우는 방법.일반적으로 스레드는 중단됨 투척과 같은 작업을 수행할 수 있음예외.
EDIT(틸로 주석):일부 API 방법은 인터럽트 처리 기능이 내장되어 있다.내 머리 위로는 이것이 포함된다.
Object.wait()
,Thread.sleep()
그리고Thread.join()
- 대부분은.
java.util.concurrent
구조물들 - Java NIO(java.io은 아니지만 java.io은 사용하지 않음
InterruptedException
, 대신 사용ClosedByInterruptException
.
EDIT(@thomas-포르닌의 답변에서 완전성을 위해 정확히 동일한 질문으로)
스레드 중단은 스레드를 부드럽게 누르는 방법이다.스레즈로 하여금 정결하게 퇴장할 수 있는 기회를 주는 데 쓰이고 있다.Thread.stop()
그것은 마치 돌격 소총으로 실을 쏘는 것과 같다.
인터럽트란 무엇인가?
인터럽트는 자신이 하고 있는 일을 멈추고 다른 일을 해야 한다는 것을 실에 암시하는 것이다.스레드가 인터럽트에 어떻게 반응하는지는 프로그래머에게 달려 있지만, 스레드가 끝나는 것은 매우 흔한 일이다.
어떻게 구현되는가?
인터럽트 메커니즘은 인터럽트 상태라고 알려진 내부 플래그를 사용하여 구현된다.스레드 호출 중.인터럽트가 이 깃발을 꽂다.정적 메서드를 호출하여 스레드가 인터럽트를 확인하는 경우.인터럽트 상태 삭제.한 스레드가 다른 스레드의 인터럽트 상태를 쿼리하기 위해 사용하는 비정적 스레드.isInterrupted는 인터럽트 상태 플래그를 변경하지 않는다.
API에서 견적:
이 실을 끊어라.먼저 이 스레드의 checkAccess 메서드가 호출되어 보안이 발생할 수 있음던질 수 있는 예외.
이 스레드가 오브젝트 클래스의 wait(), wait(긴 길이) 또는 wait(긴 길이, int) 메서드의 호출에서 차단된 경우, 조인(긴 길이, 긴 길이), 조인(긴 길이), 절전(긴 길이, int) 또는 절전(긴 길이, int) 메서드인 경우, 이 클래스의 인터럽트 상태가 지워지고 인터럽트(중단됨)를 받게 된다.예외.
인터럽트 채널의 I/O 작업에서 이 스레드가 차단되면 채널이 닫히고 스레드의 인터럽트 상태가 설정되며 스레드가 ClosedBy를 수신하게 된다.인터럽트Exception.
이 스레드가 선택기에서 차단되면 스레드의 인터럽트 상태가 설정되고 선택 작업에서 즉시 반환되며, 이는 선택기의 웨이크업 메서드가 호출된 것처럼 0이 아닌 값으로 반환될 수 있다.
이전 조건이 유지되지 않으면 이 스레드의 인터럽트 상태가 설정된다.
동일한 항목에 대해 완전히 이해하려면 이 항목을 확인하십시오.
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
대상 스레드가 대기 중인 경우(호출)wait()
, 또는 본질적으로 같은 일을 하는 다른 관련 방법들.sleep()
)) 방해를 받음으로써, 기다리던 것을 멈추고 방해를 받는 것을 의미한다.대신 예외.
그것은 전적으로 실 그 자체(호출한 코드)에 달려 있다.wait()
) 이 상황에서 어떻게 할 것인가를 결정하는 것.스레드를 자동으로 종료하지 않는다.
그것은 때때로 종료 플래그와 함께 사용된다.방해받으면 실이 이 깃발을 확인하고 스스로 닫을 수 있었다.하지만 다시 말하지만, 이것은 단지 하나의 관습일 뿐이다.
완전성의 경우, 다른 답변에 덧붙여, 스레드가 차단되기 전에 스레드가 차단되는 등의 경우, 이는 다음 예에서 알 수 있듯이, 스레드가 차단되는 즉시 스레드가 중단되는 것과 동일하다.
public class InterruptTest {
public static void main(String[] args) {
Thread.currentThread().interrupt();
printInterrupted(1);
Object o = new Object();
try {
synchronized (o) {
printInterrupted(2);
System.out.printf("A Time %d\n", System.currentTimeMillis());
o.wait(100);
System.out.printf("B Time %d\n", System.currentTimeMillis());
}
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("C Time %d\n", System.currentTimeMillis());
printInterrupted(3);
Thread.currentThread().interrupt();
printInterrupted(4);
try {
System.out.printf("D Time %d\n", System.currentTimeMillis());
Thread.sleep(100);
System.out.printf("E Time %d\n", System.currentTimeMillis());
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("F Time %d\n", System.currentTimeMillis());
printInterrupted(5);
try {
System.out.printf("G Time %d\n", System.currentTimeMillis());
Thread.sleep(100);
System.out.printf("H Time %d\n", System.currentTimeMillis());
} catch (InterruptedException ie) {
System.out.printf("WAS interrupted\n");
}
System.out.printf("I Time %d\n", System.currentTimeMillis());
}
static void printInterrupted(int n) {
System.out.printf("(%d) Am I interrupted? %s\n", n,
Thread.currentThread().isInterrupted() ? "Yes" : "No");
}
}
출력:
$ javac InterruptTest.java
$ java -classpath "." InterruptTest
(1) Am I interrupted? Yes
(2) Am I interrupted? Yes
A Time 1399207408543
WAS interrupted
C Time 1399207408543
(3) Am I interrupted? No
(4) Am I interrupted? Yes
D Time 1399207408544
WAS interrupted
F Time 1399207408544
(5) Am I interrupted? No
G Time 1399207408545
H Time 1399207408668
I Time 1399207408669
시사: 다음과 같이 루프를 반복하고, 제어 기능이 떠난 정확한 순간에 인터럽트가 발생하는 경우Thread.sleep(..)
루프를 돌고 있지만 예외는 여전히 발생할 것이다.그래서 인터럽트에 의존하는 것은 완벽하게 안전하다.스레드가 중단된 후 신뢰할 수 있게 던져지는 예외:
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException ie) {
break;
}
}
스레드 중단은 플래그 인터럽트 상태를 기반으로 한다.모든 스레드에서 인터럽트 상태의 기본값은 false로 설정된다.스레드에서 인터럽트() 메서드를 호출할 때마다 인터럽트 상태가 true로 설정된다.
- 인터럽트 상태가 true(이미 스레드에서 인터럽트()가 호출된 경우, 특정 스레드는 절전 모드로 전환되지 않는다.절전 모드가 호출되면 스레드 중단 예외가 발생한다.예외를 다시 던진 후 플래그는 false로 설정된다.
- 스레드가 이미 절전 모드인데 인터럽트()가 호출된 경우, 스레드는 절전 상태에서 벗어나 중단된 예외를 발생시킨다.
Thread.interrupt()
대상 스레드의 중단 상태/실행 상태를 true로 설정(확인 시 다음을 사용하여)Thread.interrupted()
끝없는 실을 멈추는데 도움을 줄 수 있다.http://www.yegor256.com/2015/10/20/interrupted-exception.html을 참조하십시오.
스레드.인터럽트() 메서드는 내부 '인터럽트 상태' 플래그를 설정한다.보통 그 깃발은 스레드에 의해 확인된다.방해를 받는 방법
관례에 따라 중단됨을 통해 존재하는 모든 메서드인터럽트 상태 플래그를 지워야 하는 예외.
인터럽트는 자신이 하고 있는 일을 멈추고 다른 일을 해야 한다는 것을 실에 암시하는 것이다.스레드가 인터럽트에 어떻게 반응하는지는 프로그래머에게 달려 있지만, 스레드가 끝나는 것은 매우 흔한 일이다.매우 좋은 참고사항: https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
공공의 공허한 방해.
이 실을 끊어라.
현재 스레드가 항상 허용되는 자체 중단되지 않는 한, 이 스레드의 checkAccess 메서드가 호출되어 보안이 발생할 수 있음던질 수 있는 예외.
이 스레드가 오브젝트 클래스의 wait(), wait(긴 길이) 또는 wait(긴 길이, int) 메서드의 호출에서 차단된 경우, 조인(긴 길이, 긴 길이), 조인(긴 길이), 절전(긴 길이, int) 또는 절전(긴 길이, int) 메서드인 경우, 이 클래스의 인터럽트 상태가 지워지고 인터럽트(중단됨)를 받게 된다.예외.
인터럽트 채널의 I/O 작업에서 이 스레드가 차단되면 채널이 닫히고 스레드의 인터럽트 상태가 설정되며 스레드가 ClosedBy를 수신하게 된다.인터럽트Exception.
이 스레드가 선택기에서 차단되면 스레드의 인터럽트 상태가 설정되고 선택 작업에서 즉시 반환되며, 이는 선택기의 웨이크업 메서드가 호출된 것처럼 0이 아닌 값으로 반환될 수 있다.
이전 조건이 유지되지 않으면 이 스레드의 인터럽트 상태가 설정된다.
살아 있지 않은 실을 끊는 것은 아무런 효과가 없다.
던지기: 보안예외 - 현재 스레드를 수정할 수 없는 경우
참조URL: https://stackoverflow.com/questions/3590000/what-does-java-lang-thread-interrupt-do
'programing' 카테고리의 다른 글
.o 파일 대 .a 파일 (0) | 2022.05.19 |
---|---|
지원되지 않는 major.minor 버전 52.0 (0) | 2022.05.19 |
정렬 가능에서 비활성화 옵션을 사용하는 방법부에 프로젝트에서 JS? (0) | 2022.05.19 |
스프링 MVC의 컨트롤러 작업에서 외부 URL로 리디렉션 (0) | 2022.05.19 |
Vuex / Vue를 사용하여 비동기 데이터 검색을 처리하는 방법 (0) | 2022.05.19 |