2011-08-29 2 views
5

groovy-shell-server을 신청서에 추가하고 싶습니다. 우리는 최근에 내부 API에 대한 호출로 신속한 진단을 받거나 단기적인 수정을 제공 할 수있는 몇 가지 생산 문제에 직면 해 있습니다. Groovy-shell-server는 이것을 달성 할 수있는 좋은 방법을 제공합니다.가파른 GroovyShell 서버 스레드에서 Thread.stop을 호출하는 것이 너무 위험합니까?

하지만 실제로 이것을 프로덕션에서 사용하면 잠재적 인 복잡성이 생깁니다. 신중한 동료 검토에도 불구하고 우리는 CPU를 고정 시키거나 무한 루프에 빠지게되는 스크립트를 실행한다고 가정 해 봅시다. 그 스레드를 죽일 방법이 필요해. 그래서 groovy-shell-server를 개선하여 실행중인 Groovy 클라이언트 스레드의 선택적인 hard stop()을 지원할 생각이었습니다.

나는 그 것을 안다. Thread.stop() is inherently unsafe; 그것은 discussed on StackOverflow before입니다. 제 질문은, 이점이이 경우의 위험보다 중요하다고 생각합니까? Thread.stop()을 사용하여 Runaway GroovyShell 서버 스레드에 대한 일종의 "비상 브레이크"로 실용적인 선택을하고 있습니까? 또는 객체를 일관성없는 상태로 유지할 가능성이 너무 높습니까?

(누군가가 실행중인 자바 응용 프로그램 프로그래밍, 인터럽트 대한 액세스를 제공하기 위해 더 나은 방법이있는 경우 또는, 나는 모든 귀 해요.)

답변

4

내가 일반적으로 사용되지 않는 사용하는 것이 나쁜 생각 API이며 특히 Thread.stop()을 사용하지 않는 것이 좋습니다.

하지만 예외는 없습니다. 나는 이것이 사실이라고 생각한다. 내 경험에 따르면 Thread.stop() 작품과 정말 스레드를 중지합니다. 나는 넷스케이프를 목표로 애플릿에서 수년 전에 그것을 사용했다. 일부 버전은 Thread.interrupt()을 지원하지 않습니다.

제가 생각할 수있는 유일한 대안은 별도의 프로세스를 사용하는 것입니다. 그러나이 경우 데이터 전송을 위해 일부 프로세스 간 전송을 구현해야합니다. 나는 당신의 업무에 대한 세부 사항을 알지 못하지만 보통 가격이 너무 높습니다.

그래서 내가 너라면 Thread.stop()을 사용하여 매우 큰 사과의 말을 남겼습니다.

+0

Thread.stop()이 스레드를 실제로 중지하는지 여부는 논박하지 않습니다. 확실히 그럴 것입니다. 문제는 다양한 객체를 나쁜 상태로 남겨 둘 가능성 때문에 스레드를 멈추는 것이 위험한 지 여부입니다. 일반적으로 나는 이익이 위험을 압도하는 경우가 있다고 동의합니다. – greghmerrill

+1

@greghmerrill * Thread.stop()은 실제로 스레드를 멈추게 할 것입니다. * 확실히, 모니터에서 대기중인 스레드가 중지되지 않을 수도 있습니다 (즉, 잠금 1을 유지하는 스레드를 종료해야 함). 'Thread.stop()'은 스택 트레이스를 검사하고 위험한 순간을 표시 할 수 있는지를 알고있는 경우에 * 거의 * ok입니다. 또는 코드를 뒤죽박죽 처리하고'Thread.interrupt()'를 검사하거나 다른 정적 * 안전 점 *을 호출하여 ThreadDeath와 유사한 오류를 던지는 코드 인핸서를 사용하십시오. – bestsss

+0

@bestsss _ 반드시 모니터 대기중인 스레드가 중지되지 않을 수 있습니다 (즉, 잠금이있는 스레드를 먼저 죽여야 함) _ -이 소식은 저에게 좋은 소식입니다. 팁 주셔서 감사합니다! 나는 [그것을 시험해 보았다] (https://gist.github.com/1183567), 잠금을 획득하는 스레드를 멈추게하면 즉시 잠금을 멈추지 않을 것이다. 인수. – greghmerrill

관련 문제