2010-02-19 2 views
6

스레드를 파기하는 것은 Java에서 더 이상 사용되지 않으며 (javadoc에 따라 구현되지 않음) 스레드를 중단하는 것이 예상되지만 그렇게하지 않는 것이 좋습니다. (J VM 내부의 스레드를 죽이는 방법을 제공하지 않는 것은 불안한 디자인이지만 내 질문은 디자인과 관련이 없습니다.)자바 애플리케이션 서버는 스레드를 파괴 할 수 있습니까? 그렇다면 어떻게?

Java 응용 프로그램 서버가 응용 프로그램을 언로드하는 방법은 무엇입니까? 그들은 어떻게 든 언로드되는 응용 프로그램의 스레드를 파괴 할 수 있습니까? 그렇다면 어떻게? 그렇지 않다면 무한 루프가있는 배포 된 응용 프로그램의 단일 스레드가 개입 할 가능성이없는 전체 응용 프로그램 서버를 중단시킬 수 있습니까?

죄송합니다.이 테스트 케이스를 작성하지는 않지만 실제로 진행되고있는 작업을 알고 싶습니다.

답변

2

ejb 서버 내에 자신의 스레드를 만들 수 없습니다.

웹 컨테이너 (예 : tomcat)에 스레드를 생성하는 경우는 드뭅니다. 실제로 수행하는 것에 대해 신중히 생각해야하며 스레드의 수명주기를 관리해야합니다.

+1

Bean의 메소드 중 하나에서 "구현 된"무한 루프가있을 때 Application Server는 어떤 작업을 수행 할 수 있습니까? 전체 응용 프로그램 서버를 OS 수준에서 다시 시작해야합니까? – sibidiba

+1

@sibidiba - 예. 그게 다야. –

11

는 J VM 내부 스레드를 죽일 수있는 방법을 제공하지 않기 교란 디자인이지만, 내 질문은 관련 설계되지 않습니다.

진짜 질문에 답을 얻었으므로 위의 인용문을 처리 할 예정입니다.

자바 디자이너 원래 스레드를 죽이고 일시 중단하는 문제를 해결하려고했지만 Java 언어의 컨텍스트에서 해결할 수없는 근본적인 문제가 발생했습니다.

문제는 공유되지 않은 방식으로 공유 데이터를 변경할 수 있거나 대기/알림 메커니즘을 사용하여 다른 사용자와 동기화 할 수있는 안전하게 스레드를 죽일 수 없다는 것입니다. 이 컨텍스트에서 스레드 종료를 구현하면 데이터 구조에 대한 부분 업데이트와 절대로 도달하지 않을 알림 대기중인 다른 스레드로 끝납니다. 즉, 한 스레드를 종료하면 응용 프로그램의 나머지 부분이 불확실하고 깨진 상태로 남을 수 있습니다.

관련 규격/교과서가 명확하지 않은 경우에도 위에서 설명한 동일한 문제로 인해 스레드를 죽일 수있는 다른 언어/라이브러리 (예 : C, C++, C#)가 있습니다. 스레드를 죽일 수는 있지만 안전하게 수행하려면 전체 응용 프로그램의 디자인과 구현을 신중하게해야합니다. 일반적으로 말하기는 너무 어렵습니다.

Java에서 스레드 살인을 안전하게하려면 무엇이 필요합니까? 여기에 몇 가지 아이디어가 있습니다 :

  • 구현하여 JVM 당신이 아이를 격리에 죽일 수도 있습니다 계산을 실행할 수있는 격리 된 것합니다. 문제는 적절하게 구현 된 격리가 메시지 전달을 통해 다른 격리와 통신 할 수 있으며 일반적으로 사용하기에 훨씬 더 비쌉니다.

  • 공유 가변 상태의 문제는 완전히 돌연변이를 금지하거나 Java 실행 모델에 트랜잭션을 추가함으로써 해결할 수 있습니다. 이 두 가지 모두 근본적으로 Java를 바꿀 것입니다.

  • wait/notify 문제는 "다른"스레드가 상호 작용하고있는 스레드가 사라 졌다는 정보를 수신 할 수있는 랑데부 또는 메시지 전달 메커니즘으로 대체하여 해결할 수 있습니다. "다른"쓰레드는 여전히 이것을 복구하기 위해 코딩해야합니다.

편집 - 응답에서 commments합니다.

뮤텍스 데드락은 파괴 된 스레드가 소유 한 모든 뮤텍스를 해제 (중단)하도록 설계 되었기 때문에 thread.destroy()의 경우 문제가되지 않았습니다. 문제는 잠금이 해제 된 후에 뮤텍스에 의해 보호 된 데이터 구조가 정상 상태에 있다는 보장이 없다는 것이 었습니다.

내가 제대로이 주제의 역사를 이해한다면, Thread.suspend(), Thread.delete()에 정말 실제 자바 1.0 애플리케이션에서 문제를 야기했다. 그리고 이러한 문제는 매우 심각하고 응용 프로그램 작성자가 처리하기가 어려웠으므로 JVM 설계자가 가장 좋은 방법은 메소드를 사용하지 않는 것으로 결정한 것입니다. 이것은 쉬운 결정이 아니었을 것입니다.

이제 용감한 사람이라면 실제로 이러한 방법을 사용할 수 있습니다. 그리고 실제로 어떤 경우에는 안전 할 수 있습니다. 그러나 deprecated 메소드를 중심으로 애플리케이션을 구축하는 것은 올바른 소프트웨어 엔지니어링 방법이 아닙니다.

+1

This, times a hundred –

+0

저는 하드 코어 JVM 디자이너는 아니지만, 딜럭스에 대한 모든 주장은 너무 많이 만들어졌습니다. 이 기능을 비활성화해도 Java 교착 상태가 발생하지 않았습니다. 나는 단순히 자물쇠를하고 결코 자물쇠를 열지 않습니다. thread.destroy()를 허용하면 실제로 교착 상태가 발생할 가능성이 있지만,이 세상에서는 프로그래머 나 JVM에 따라 리소스를 보유하지 않는 스레드를 죽일 수없는 이유는 무엇입니까? – sibidiba

+1

@sibida : 몇 년 전, 몇 년 전, 나는 쓰레드를 파괴하기 위해 더 이상 사용하지 않는 방법을 사용했다. 나는 쓰레기를 '안전하다'는 것을 알고 있었고, 나는 아무런 문제가 없었다. * * 그러나 나는 그런 일을 오래 멈추었다. : 소켓을 닫거나, 독이있는 피임약을 블로킹 대기열에 넣거나, 'shouldExit'부울을 true로 설정하여 제어 할 수있는 스레드를 '취소'하는 방법은 항상 있습니다. '파멸'이 정말로 필요했고 계속하고 있었지만 지금은 더 이상 그렇지 않습니다. 항상 다른 방법이 있을까요? 스레드를 '깔끔하게'취소 할 방법이없는 경우는 어떻게 될까요? – SyntaxT3rr0r