다중 스레드 Java 프로그램에서는 모든 스레드가 실행을 완료할 때까지 전체 프로그램이 종료되지 않습니다. (데몬이 아닌 모든 스레드의 실행이 완료된다는 점에 유의해야 합니다. 스레드가 System.exit() 메서드를 실행하면 프로그램도 종료됩니다.) 때로는 스레드의 실행을 중단하고 싶을 수도 있습니다. 예를 들면 다음과 같습니다. 프로그램을 종료하고 싶거나 실행 중인 작업을 취소하고 싶은 경우 등
Java는 실행을 종료하려는 스레드를 명시적으로 중단할 수 있는 인터럽트 메커니즘을 제공합니다. 인터럽트 메커니즘의 한 가지 기능은 스레드가 중단되었는지 확인한 다음 중단 요청에 응답할지 여부를 결정할 수 있다는 것입니다. 스레드는 중단 요청을 무시하고 실행을 계속할 수도 있습니다.
이 섹션에서 우리가 개발한 샘플 프로그램은 스레드를 생성하고 5초 후에 인터럽트 메커니즘을 사용하여 스레드를 강제로 종료합니다.
알아요
샘플 프로그램을 완료하려면 아래 단계를 따르세요.
1. PrimeGenerator라는 클래스를 생성하고 Thread 클래스를 상속합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
공개 클래스 PrimeGenerator는 Thread {를 확장합니다.
2. run() 메소드를 다시 작성하고 메소드에 무한 루프를 추가합니다. 루프 내에서 1부터 시작하는 연속된 양의 정수가 소수인지 계산을 통해 확인합니다. 그렇다면 콘솔에 인쇄하십시오. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
@보수
공개 무효 실행() {
긴 숫자 = 1L;
동안 (참) {
if (isPrime(숫자)) {
System.out.printf("숫자 %d /tis 소수입니다.", number);
}
3. 숫자를 처리한 후 isInterrupted() 메소드를 호출하여 스레드가 중단되었는지 확인합니다. 이 메서드가 true를 반환하면 문장이 콘솔에 인쇄된 다음 스레드 실행이 종료됩니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
if (isInterrupted()) {
System.out.println("프라임 생성기가 중단되었습니다.");
반품;
}
숫자++;
}
}
4. 매개변수가 소수인지 확인하는 데 사용되는 isPrime() 메서드를 구현합니다. 그렇다면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
/**
* 매개변수가 소수인지 확인
*
* @param number 심사할 숫자
* @반품
*/
개인 부울 isPrime(긴 숫자) {
if (숫자 <= 2) {
사실을 반환;
}
for (int i = 2; i < 숫자; i++) {
if ((숫자 % i) == 0) {
거짓을 반환;
}
}
사실을 반환;
}
5. 이제 샘플 프로그램의 메인 클래스인 Main 클래스와 main() 메소드를 구현해 보겠습니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
공개 클래스 메인 {
공개 정적 무효 메인(String[] args) {
6. PrimeGenerator 객체를 생성하고 스레드를 시작합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
스레드 작업 = new PrimeGenerator();
task.start();
7. 5초 동안 기다린 후 스레드를 종료합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
노력하다 {
TimeUnit.SECONDS.sleep(5L);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
task.interrupt();
8. 예제를 실행하고 결과를 확인합니다.
왜인지 알아
아래는 예제 프로그램 실행의 인쇄된 조각입니다. 인쇄된 문자를 통해 PrimeGenerator 스레드가 정보를 인쇄하는 방법과 스레드가 중단되었음을 감지한 경우 실행을 종료하는 방법을 확인할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
번호 43063이 프라임입니다.
번호 43067이 프라임입니다.
43093번이 프라임입니다.
43103번이 프라임입니다.
번호 43117이 프라임입니다.
프라임 생성기가 중단되었습니다
Thread에는 스레드가 중단되었는지 여부를 나타내는 부울 함수가 있습니다. Interrupt() 메서드가 호출되면 true로 설정됩니다. isInterrupted() 메서드는 속성의 현재 값을 반환합니다.
끝나지 않는
Thread에는 또한 스레드가 중단되었는지 확인하는 메서드가 있습니다. 즉, 현재 실행 중인 스레드가 중단되었는지 확인할 수 있는 static 메서드인 Interrupted()가 있습니다.
다음과 같이 코드 코드를 복사합니다.
isInterrupted() 메서드와 Interrupted() 메서드 사이에는 큰 차이가 있습니다. 전자는 스레드 중단 여부에 대한 속성 값을 변경하지 않지만 후자는 해당 값을 false로 설정할 수 있습니다. Interrupted()는 정적 메서드입니다. 일상적인 개발에는 isInterrupted() 메서드를 사용하는 것이 좋습니다.
앞서 언급했듯이 스레드는 인터럽트 요청을 무시하고 실행을 계속할 수 있습니다. 그러나 이는 우리가 원하는 결과가 아닙니다.
교리를 사용하라
이 글은 "Java 7 Concurrency Cookbook"(D Gua Ge가 "Java7 Concurrency 예제 모음"으로 훔쳤습니다)을 번역한 것이며, 학습 자료로만 사용됩니다. 허가 없이 상업적인 목적으로 사용할 수 없습니다.
작은 성공
예제 프로그램에 사용된 모든 코드의 완전한 버전입니다.
PrimeGenerator 클래스의 전체 코드는 다음과 같습니다.
패키지 com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* 날짜: 2013-09-18
* 시간: 11:53
*/
공개 클래스 PrimeGenerator는 Thread {를 확장합니다.
@보수
공개 무효 실행() {
긴 숫자 = 1L;
동안 (참) {
if (isPrime(숫자)) {
System.out.printf("숫자 %d /tis Prime./n", number);
}
if (isInterrupted()) {
System.out.println("프라임 생성기가 중단되었습니다.");
반품;
}
숫자++;
}
}
/**
* 매개변수가 소수인지 확인
*
* @param number 심사할 숫자
* @반품
*/
개인 부울 isPrime(긴 숫자) {
if (숫자 <= 2) {
사실을 반환;
}
for (int i = 2; i < 숫자; i++) {
if ((숫자 % i) == 0) {
거짓을 반환;
}
}
사실을 반환;
}
}
Main 클래스의 전체 코드
다음과 같이 코드 코드를 복사합니다.
패키지 com.diguage.books.concurrencycookbook.chapter1.recipe3;
import java.util.concurrent.TimeUnit;
/**
* 날짜: 2013-09-18
* 시간: 12:33
*/
공개 클래스 메인 {
공개 정적 무효 메인(String[] args) {
스레드 작업 = new PrimeGenerator();
task.start();
노력하다 {
TimeUnit.SECONDS.sleep(5L);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
task.interrupt();
}
}