Java 스레드 우선 순위 <br /> 피해야 할 멀티 태스킹과 관련된 특수 유형의 오류는 교착 상태입니다. 교착 상태는 두 스레드가 한 쌍의 동기 객체에 원형 의존성을 가질 때 발생합니다. 예를 들어, 하나의 스레드가 Object X의 파이프 라인에 들어가고 다른 스레드가 Object Y의 파이프 라인으로 들어가는다고 가정합니다. X의 스레드가 Y의 동기화 메소드를 호출하려고하면 예상대로 잠겨 있습니다. y 스레드는 또한 x의 일부 동기화 방법을 호출하려고합니다. 스레드는 영원히 기다립니다. x에 도달하려면 첫 번째 스레드를 완성하려면 자체 잠금 장치를 해제해야합니다. 교착 상태는 다음과 같이 디버깅하기가 매우 어려운 오류입니다.
일반적으로 거의 발생하지 않으며 두 스레드의 시간이 일치하는 경우에만 발생합니다.
여기에는 두 개 이상의 스레드와 동기식 객체가 포함될 수 있습니다 (즉, 방금 설명한 예제보다 더 복잡한 이벤트 시퀀스가있을 때 교착 상태가 발생할 수 있습니다).
교착 상태를 완전히 이해하려면 행동을 관찰하는 것이 유용합니다. 다음 예제는 각각 foo () 및 bar () 메소드의 두 가지 클래스 A와 B를 생성합니다. 이 두 가지 방법은 다른 클래스의 방법을 호출하기 전에 잠시 일시 중지됩니다. Deadlock이라는 메인 클래스는 A와 B의 인스턴스를 생성 한 다음 두 번째 스레드를 시작하여 교착 상태 환경을 설정합니다. foo () 및 bar () 메소드는 수면 ()을 사용하여 교착 상태를 강제합니다.
// 교착 상태의 예. thread .sleep (1000)} catch (예외 e) {system.out.println (} system.out.println; (. System .out.println (name + "b.bar") {thread.sleep (1000) {system.out.println ( "b Interrupted"); n (이름 + a.last ()를 호출하려면 (); {a = b b = deadlock () (); A.foo는이 스레드에서 잠금을받습니다. 다른 스레드에서 B를 가져옵니다. 프로그램을 실행 한 후 출력은 다음과 같습니다.
MainThread 입력 A.fooracingthread는 b.last () racingthread를 호출하려고 B.barmainthread에 입력했습니다 a.last ()
프로그램이 교착 상태에 있으므로 CTRL-C를 눌러 프로그램을 종료해야합니다. PC에서 Ctrl-Break를 누르면 (또는 Solaris에서 Ctrl-/ 아래를 누르면) 전체 스레드와 파이프 라인 버퍼 힙을 볼 수 있습니다. Racingthread는 관리 프로세스 A를 기다리는 동안 관리 프로세스 B를 차지하며 동시에 Mainthread는 관리 프로세스를 기다리는 것을 차지합니다. b. 프로그램은 결코 끝나지 않을 것입니다. 이 예제에서 알 수 있듯이 멀티 스레드 프로그램은 종종 잠겨 있으며 교착 상태가 확인 해야하는 첫 번째 문제입니다.
Java 스레드 교착 상태 <br /> 피해야 할 멀티 태스킹과 관련된 특수 유형의 오류는 교착 상태입니다. 교착 상태는 두 스레드가 한 쌍의 동기 객체에 원형 의존성을 가질 때 발생합니다. 예를 들어, 하나의 스레드가 Object X의 파이프 라인에 들어가고 다른 스레드가 Object Y의 파이프 라인으로 들어가는다고 가정합니다. X의 스레드가 Y의 동기화 메소드를 호출하려고하면 예상대로 잠겨 있습니다. y 스레드는 또한 x의 일부 동기화 방법을 호출하려고합니다. 스레드는 영원히 기다립니다. x에 도달하려면 첫 번째 스레드를 완성하려면 자체 잠금 장치를 해제해야합니다. 교착 상태는 다음과 같이 디버깅하기가 매우 어려운 오류입니다.
일반적으로 거의 발생하지 않으며 두 스레드의 시간이 일치하는 경우에만 발생합니다.
여기에는 두 개 이상의 스레드와 동기식 객체가 포함될 수 있습니다 (즉, 방금 설명한 예제보다 더 복잡한 이벤트 시퀀스가있을 때 교착 상태가 발생할 수 있습니다).
교착 상태를 완전히 이해하려면 행동을 관찰하는 것이 유용합니다. 다음 예제는 각각 foo () 및 bar () 메소드의 두 가지 클래스 A와 B를 생성합니다. 이 두 가지 방법은 다른 클래스의 방법을 호출하기 전에 잠시 일시 중지됩니다. Deadlock이라는 메인 클래스는 A와 B의 인스턴스를 생성 한 다음 두 번째 스레드를 시작하여 교착 상태 환경을 설정합니다. foo () 및 bar () 메소드는 수면 ()을 사용하여 교착 상태를 강제합니다.
// 교착 상태의 예. thread .sleep (1000)} catch (예외 e) {system.out.println (} system.out.println; (. System .out.println (name + "b.bar") {thread.sleep (1000) {system.out.println ( "b Interrupted"); n (이름 + a.last ()를 호출하려면 (); {a = b b = deadlock () (); A.foo는이 스레드에서 잠금을받습니다. 다른 스레드에서 B를 가져옵니다. 프로그램을 실행 한 후 출력은 다음과 같습니다.
MainThread 입력 A.fooracingthread는 b.last () racingthread를 호출하려고 B.barmainthread에 입력했습니다 a.last ()
프로그램이 교착 상태에 있으므로 CTRL-C를 눌러 프로그램을 종료해야합니다. PC에서 Ctrl-Break를 누르면 (또는 Solaris에서 Ctrl-/ 아래를 누르면) 전체 스레드와 파이프 라인 버퍼 힙을 볼 수 있습니다. Racingthread는 관리 프로세스 A를 기다리는 동안 관리 프로세스 B를 차지하며 동시에 Mainthread는 관리 프로세스를 기다리는 것을 차지합니다. b. 프로그램은 결코 끝나지 않을 것입니다. 이 예제에서 알 수 있듯이 멀티 스레드 프로그램은 종종 잠겨 있으며 교착 상태가 확인 해야하는 첫 번째 문제입니다.