는 J VM 내부 스레드를 죽일 수있는 방법을 제공하지 않기 교란 디자인이지만, 내 질문은 관련 설계되지 않습니다.
진짜 질문에 답을 얻었으므로 위의 인용문을 처리 할 예정입니다.
자바 디자이너 원래 은 스레드를 죽이고 일시 중단하는 문제를 해결하려고했지만 Java 언어의 컨텍스트에서 해결할 수없는 근본적인 문제가 발생했습니다.
문제는 공유되지 않은 방식으로 공유 데이터를 변경할 수 있거나 대기/알림 메커니즘을 사용하여 다른 사용자와 동기화 할 수있는 안전하게 스레드를 죽일 수 없다는 것입니다. 이 컨텍스트에서 스레드 종료를 구현하면 데이터 구조에 대한 부분 업데이트와 절대로 도달하지 않을 알림 대기중인 다른 스레드로 끝납니다. 즉, 한 스레드를 종료하면 응용 프로그램의 나머지 부분이 불확실하고 깨진 상태로 남을 수 있습니다.
관련 규격/교과서가 명확하지 않은 경우에도 위에서 설명한 동일한 문제로 인해 스레드를 죽일 수있는 다른 언어/라이브러리 (예 : C, C++, C#)가 있습니다. 스레드를 죽일 수는 있지만 안전하게 수행하려면 전체 응용 프로그램의 디자인과 구현을 신중하게해야합니다. 일반적으로 말하기는 너무 어렵습니다.
Java에서 스레드 살인을 안전하게하려면 무엇이 필요합니까? 여기에 몇 가지 아이디어가 있습니다 :
구현하여 JVM 당신이 아이를 격리에 죽일 수도 있습니다 계산을 실행할 수있는 격리 된 것합니다. 문제는 적절하게 구현 된 격리가 메시지 전달을 통해 다른 격리와 통신 할 수 있으며 일반적으로 사용하기에 훨씬 더 비쌉니다.
공유 가변 상태의 문제는 완전히 돌연변이를 금지하거나 Java 실행 모델에 트랜잭션을 추가함으로써 해결할 수 있습니다. 이 두 가지 모두 근본적으로 Java를 바꿀 것입니다.
wait/notify 문제는 "다른"스레드가 상호 작용하고있는 스레드가 사라 졌다는 정보를 수신 할 수있는 랑데부 또는 메시지 전달 메커니즘으로 대체하여 해결할 수 있습니다. "다른"쓰레드는 여전히 이것을 복구하기 위해 코딩해야합니다.
편집 - 응답에서 commments합니다.
뮤텍스 데드락은 파괴 된 스레드가 소유 한 모든 뮤텍스를 해제 (중단)하도록 설계 되었기 때문에 thread.destroy()
의 경우 문제가되지 않았습니다. 문제는 잠금이 해제 된 후에 뮤텍스에 의해 보호 된 데이터 구조가 정상 상태에 있다는 보장이 없다는 것이 었습니다.
내가 제대로이 주제의 역사를 이해한다면, Thread.suspend()
, Thread.delete()
등 에 정말 실제 자바 1.0 애플리케이션에서 문제를 야기했다. 그리고 이러한 문제는 매우 심각하고 응용 프로그램 작성자가 처리하기가 어려웠으므로 JVM 설계자가 가장 좋은 방법은 메소드를 사용하지 않는 것으로 결정한 것입니다. 이것은 쉬운 결정이 아니었을 것입니다.
이제 용감한 사람이라면 실제로 이러한 방법을 사용할 수 있습니다. 그리고 실제로 어떤 경우에는 안전 할 수 있습니다. 그러나 deprecated 메소드를 중심으로 애플리케이션을 구축하는 것은 올바른 소프트웨어 엔지니어링 방법이 아닙니다.
Bean의 메소드 중 하나에서 "구현 된"무한 루프가있을 때 Application Server는 어떤 작업을 수행 할 수 있습니까? 전체 응용 프로그램 서버를 OS 수준에서 다시 시작해야합니까? – sibidiba
@sibidiba - 예. 그게 다야. –