1. 소개
이 기사는 Java Multithreading의 인터럽트 메커니즘에 대한 몇 가지 지식을 기록합니다. 주로 정지 방법, Interrupted () 및 Islerrupted () 메소드의 차이로 구성되며 소스 코드 구현에서 간단한 분석을 수행합니다.
자바에서 실행 스레드를 종료하는 3 가지 방법이 있습니다.
① 스레드가 정상적으로 종료됩니다. 즉, run () 메소드가 실행되었습니다.
stride 스레드 클래스의 stop () 메소드를 사용하여 스레드를 강제로 종료하십시오. 그러나 STOP () 메소드가 만료되었으며 사용하는 것이 좋습니다.
인터럽트 메커니즘을 사용하십시오
스레드가 정상적으로 나올 때 할 일은 없습니다. 인터럽트 메커니즘은 아래에 자세히 도입됩니다. 먼저 stop () 메소드의 소스 코드를 살펴 보겠습니다. 핵심은 소스 코드에 대한 주석입니다. STOP ()가 안전하지 않은 이유를 설명합니다. 어떤 스레드가 stop () 메소드에 의해 중지됩니까?
/*** 스레드가 실행을 중단하도록 강요합니다.* <p>* 보안 관리자가 설치된 경우 <code> CheckAccess </code>* 메소드는 <code>이 </code>*로 호출됩니다. 이로 인해* <code> code>가 올릴 수 있습니다 (현재 스레드에서). <code> securityException </code> (현재 스레드에서).* <p>*이 스레드가 나타내는 스레드는 비정상적으로 수행하는 모든 것을 멈추고 예외를 제외하고 새로 작성된* <code> threaddeath </code> 객체를 던져야합니다.* <p>* 스레드가 아직 시작되지 않은 스레드를 중지 할 수 있습니다. <code> threaddeath </code> 특별한 청소 작업을 수행하지 않아도 (* <code> threaddeath </code>의 던지기는 <code> 마지막으로 </code> 조항의 조항을 시도합니다. <code> catch </code> 조항은* <code> threaddeath </code> 객체를 잡는 경우, 스레드가 실제로 죽을 수 있도록* 객체를 재고하는 것이 중요합니다.* <p>* exciptions* <surections* </excence </excence </excence </reencection*. 이 스레드를 수정하십시오.* @see #interrupt ()* @see #checkaccess ()* @see #run ()* @see #start ()* @see threaddeath* @see threadgroup #uncaughtexception (스레드, 던지기 가능)* @see securitymanager #checkaccess (reckaccess (reckaccess)* @see securitymanager #checkpermential* @deprecated. * thread.stop으로 스레드를 중지하면* 고정 된 모든 모니터가 잠금을 잠금 해제하게됩니다. 이 모니터에 의해 이전에 보호 된 물체가* 일치하지 않는 상태에있는 경우, 손상된 물체는 다른 실로 볼 수있게되므로 잠재적으로 임의의 동작이 발생합니다. <code> stop </code>의 많은* 사용은 대상 스레드가* 실행 중지*를 표시하기 위해 일부 변수를 단순히 수정하는 코드로 대체해야합니다. 대상 스레드는이 변수*를 정기적으로 확인하고 변수가 실행을 중지하는 것을 나타내는 경우 순서대로 실행 방법에서 순서대로 반환해야합니다. * 대상 스레드가 장기간 (예를 들어 조건 변수) 대기하는 경우 (예를 들어*) <code> 인터럽트 </code> 메소드는 대기를 방해하는 데 사용해야합니다.* 자세한 내용은* <a href = "{@docroot} /../ technots/guides/strideprimitivedeprecation.html"을 참조하십시오. 감가 상각 된? </a>.*/@wambleatedpublic final void stop () {stop (new ThreadDeath ());}위에서 언급 한 바와 같이, 9 ~ 16 행은 spop () 메소드가 "다른 스레드"를 중지 할 수 있음을 나타냅니다. 스레드를 실행하는 스레드는 현재 스레드라고하며 "기타 스레드"는 스레드를 () 메소드를 호출하는 객체 스레드로 표시되는 스레드입니다.
좋다:
public static void main (String [] args) {Mythread Thread = new Mythread ... // .... thread.stop (); // ..}기본 메소드에서 현재 스레드가 기본 스레드입니다. 4 행으로 실행되며 "다른 스레드"스레드를 중지하려고합니다. 이 다른 스레드는 새로운 신화 클래스의 스레드 객체로 표시되는 스레드입니다.
21 ~ 23 행은 아직 시작되지 않은 스레드를 중지 할 수 있음을 나타냅니다. 그 효과는 : 스레드가 시작되면 즉시 끝납니다.
48 행 후 주석은 왜 정지 () 메소드가 더 이상 사용되지 않는 이유를 깊이 보여줍니다! 그것이 안전하지 않은 이유.
예를 들어, Threada 스레드에는 은행 양도 금액과 같은 특정 임계 자원을 보호 할 책임이있는 모니터가 있습니다. 전송 프로세스가 진행되는 경우 기본 스레드는 Threada.stop () 메소드를 호출합니다. 결과적으로 모니터가 해제되고 보호 자원 (전송 금액)은 일관성이 없을 것입니다. 예를 들어, 계정 A는 100으로 감소한 반면 계정 B는 100으로 증가하지 않았습니다.
둘째, 인터럽트 메커니즘
Java에서 인터럽트 메커니즘을 올바르게 사용하는 방법에 대한 세부 정보가 너무 많습니다. 중단 된 () 및 islerrupted () 메소드는 현재 스레드가 중단 상태인지 여부를 반영합니다.
① 중단 된 ()
/*** 현재 스레드가 중단되었는지 여부를 테스트합니다. 스레드의* <i> 중단 상태 </i>는이 방법에 의해 지워집니다. 다시 말해서,이 방법이 연속적으로 두 번 호출되면* 두 번째 호출은 False를 반환합니다 (현재 스레드가 다시 중단되지 않는 한, 첫 번째 호출이 중단 상태를 지우고 두 번째 호출이 검토하기 전에 스레드가 살아 있지 않기 때문에 스레드가 살아 있지 않기 때문에 스레드가 무시됩니다. 인터럽트;* <code> false </code> 그렇지 않으면.* @see #ISTRUPTED ()* @revised.*/public static boolean Interrupted () {return currentthread (). islerprupted (true);}소스 코드의 주석에서 현재 스레드의 인터럽트 상태를 테스트 하며이 방법은 인터럽트 상태를 지우게됩니다.
hinterrupted ()
/***이 스레드가 중단되었는지 테스트합니다. 스레드의 <i> 인터럽트* 상태 </i>는이 방법에 영향을받지 않습니다. ** <p> 스레드가 살아 있지 않았기 때문에 스레드 인터럽트가 무시됩니다.*이 방법에 의해이 방법* @return <code> true> </code>가 중단 된 경우;*/code> @see # # @regoved. isTerrupted () {return isler -interrupted (false);}소스 코드 댓글에서 볼 수 있듯이 islerrupted () 메소드는 인터럽트 상태를 지우지 않습니다.
interrupted () 메소드와 Islerrupted () 메소드 간의 차이
소스 코드에서 볼 수 있듯이 두 가지 메소드는 파라미터가있는 하나가 참이고 매개 변수를 가진 다른 하나는 False라는 점을 제외하고는 istrolpted (부울 Clear -interrupted)라고합니다.
/*** 일부 스레드가 중단 된 경우 테스트합니다. 중단 된 상태*는 통과 된 명확한 중단 값에 기초하여 재설정되거나 그렇지 않습니다.*/개인 기본 부울은 중단 (부울 명확한 중단);
따라서 첫 번째 차이점은 인터럽트 플래그 비트를 지우고 다른 하나는 인터럽트 플래그 비트를 지우지 않는다는 것입니다.
소스 코드를 분석 한 후에는 반환 문에서 두 번째 차이점을 볼 수 있습니다.
public static boolean interrupted () {return currentthread (). islerrupted (true);}/***********************/public boolean islerrupted () {return isler -interrupted (false);}중단 된 ()는 현재 스레드의 중단 된 상태를 테스트합니다. islerrupted ()는 메소드를 호출하는 객체로 표시되는 스레드를 테스트합니다. 하나는 정적 메소드 (현재 스레드의 인터럽트 상태를 테스트)이고 다른 하나는 인스턴스 메소드입니다 (인스턴스 객체로 표시되는 스레드의 인터럽트 상태를 테스트).
다음은이 차이를 더 명확하게 설명하기위한 구체적인 예입니다.
다음과 같이 사용자 정의 스레드 클래스가 있습니다.
public class mythread는 스레드 {@overridepublic void run () {super.run (); for (int i =; i <; i ++) {system.out.println ( "i =" + (i +));}}}을 확장합니다.먼저 Interrupted () 메소드의 예를 살펴 보겠습니다.
public class run {public static void main (String [] args) {try {Mythread Thread = new mythread (); thread.start (); thread.sleep (); thread.interrupt (); // thread.currentThread (). interprupt (); system.out.println ( "stop? ="+thread.terrupted ()); // falsystem.out.println ( "stop? ="+thread. interrupted ()); // ...5 행은 스레드 스레드를 시작하고 6 행은 메인 스레드를 1 초 동안 수면하여 스레드 스레드가 CPU 실행을 얻을 수 있도록합니다.
메인 스레드가 1S를 위해 잠을 자면 실행이 7 행으로 재개되어 스레드 스레드를 방해하도록 요청합니다.
Line 9는 스레드가 중단 상태인지 여부를 테스트합니다. 여기서 어떤 스레드를 테스트하고 있습니까? ? ? 대답은 메인 스레드입니다. 왜냐하면:
(1) Interrupted () 현재 스레드의 인터럽트 상태를 테스트합니다.
(2) 메인 스레드는 9 번째 라인 문을 실행하므로 메인 스레드는 현재 스레드입니다.
islerrupted () 메소드의 예를 살펴 보겠습니다.
public class run {public static void main (string [] args) {try {mythread strule = new Mythread (); thread.start (); thread.sleep (); thread.interrupt (); system.out.println ( "it that? ="+thread.isterrupted ()); // true8 행에서는 스레드 객체가 호출하는 islerrupted () 메소드입니다. 따라서 스레드 객체로 표시되는 스레드의 인터럽트 상태가 테스트됩니다. 7 행에서 기본 스레드는 스레드 스레드를 방해해야하므로 8 행의 결과는 다음과 같습니다.