2012-05-18 2 views
0

나는 정상적으로 스레드를 닫는 데 알맞고 올바른 해결책을 알고 있습니다.안드로이드/자바에서 * 응답하지 않는 스레드를 죽이는 것

내 게임이 내결함성이 있다고 가정하고 새로운 게임 플레이가 시작되면 이전 게임 플레이의 (일시 중지 된) 스레드를 정상적으로 닫으려고합니다. 이전 스레드가 버그가있어 무한 루프에 있기 때문에 조인에 실패하거나 닫는 경우 새 스레드를 인스턴스화하고이를 시작합니다. 그러나 나는 오래된 실이 여전히 거기에있어 먹는 자원을 좋아하지 않습니다.

프로세스를 죽이지 않고 응답하지 않는 스레드를 죽일 수있는 방법이 있습니까? 나에게 스레드가 Thread.stop()에 반응하지 않을 수도있는 곳을 실제로 읽지는 못하는 것 같습니다.

그러므로 버그가있어 무한 루프의 스레드를 다루는 방법은 없습니까? 스레드가 Thread.stop()에 반응하더라도 Thread.stop()은 Dalvik VM을 일관성없는 상태로 남겨 둘 수 있습니다 ...

답변

1

이 기능이 필요한 경우 설계하고 구현해야합니다. 물론 스레드를 종료하는 적절한 방법을 설계하고 구현하지 않으면 스레드를 정상적으로 종료 할 방법이 없습니다. 솔루션이 응용 프로그램마다 다르므로 일반 솔루션은 없습니다. 예를 들어, 스레드가 보유 할 수있는 자원과 스레드가 잠금을 유지하거나 손상되었을 수있는 공유 상태에 따라 다릅니다.

정답은 다음과 같습니다.이 기능이 필요한 경우 스레드를 사용하지 마십시오. 프로세스를 사용하십시오.

핵심 이유는 스레드가 작동하는 방식입니다. 잠금을 획득 한 다음 공유 데이터를 조작합니다. 공유 데이터를 조작하는 동안 불일치 상태가 될 수 있습니다. 잠금을 해제하기 전에 데이터를 일관성있는 상태로 복원하는 것은 스레드의 절대적인 책임입니다. 예를 들어, 이중 연결 목록에서 개체를 삭제하는 경우 먼저 정방향 연결 또는 역방향 연결을 조정해야하며 두 작업 사이에 연결 목록의 상태가 일관성이 없습니다.

이 코드가 있습니다

  1. 획득 잠금 또는 동기화 된 블록을 입력합니다.

  2. 잠금 상태를 수정하여 공유 보호를 시작하십시오.

  3. 버그

  4. 돌아 잠금이 일관성있는 상태로 보호하는 데이터를.

  5. 잠금을 해제하십시오.

그래서 이제 어떻게해야합니까? 3 단계에서 스레드가 잠금을 보유하고 버그가 발생하여 예외가 트리거되었습니다. 1 단계에서 획득 한 잠금을 해제하지 않으면 동일한 잠금을 얻으려는 모든 스레드가 영원히 기다릴 것이고 우리는 운명을 잃을 것입니다. 1 단계에서 획득 한 잠금을 해제하면 잠금을 획득 한 모든 스레드는 단계 4에 도달하지 못해서 스레드가 정리에 실패한 일관성없는 공유 상태를 볼 수 있습니다. 어느 쪽이든, 우리는 운명을 정해야합니다.

스레드가 예외 조건을 만나면 응용 프로그램 프로그래머가 정상적인 처리 방법을 만들지 못했고 프로세스가 운명 지어집니다.

+0

그러나 문제는 정확히 내결함성입니다.어떤 이유로 든 스레드가 무한 루프에 빠졌고 새로운 스레드가 필요합니다 (이전 스레드는 죽을 수 있음). 개발자는 버그를 디자인하지 않고 방금 버그가 생깁니다. 내 스레드는 우아한 메커니즘을 가지고 있지만 분명히 프로그래머 오류로 무한 루프가 발생하면 아무 것도 할 수 없습니다. 내 질문은 정상 종료에 관한 것이 아니라 안정적인 종료에 관한 것입니다. 그건 작동하고 VM이 일관성이없는 상태로 내버려 두지 않을 것입니다. 쓰레드가 그 시간까지 불필요한 내 자신의 변수는 그렇게 재사용되지 않지만 안드로이드 워드 프로세서는 VM을 언급합니다 ... –

+0

"우리는 새 스레드 "라는 말은 새로운 게임 플레이가 시작되었으므로 오래된 스레드는 필요 없지만 리소스를 정리하기 위해 지워 져야한다는 것입니다 (프로그래밍 오류로 인해 무한 루프에 있기 때문에 정상적으로 완료 될 수 없습니다).). –

+1

@ThomasCalc : "올바르게 처리 할 코드를 작성하지 않은 경우 어떻게 처리 할 수 ​​있습니까?" 분명히, 당신은 할 수 없습니다. 스레드는 모든 프로세스 리소스에 액세스 할 수 있으므로 오염되지 않은 프로세스 리소스는 없다고 가정합니다. 스레드 사이에 벽이 없습니다 (우리가 사용하는 이유입니다). 그래서 스레드가 손상된 경우 프로세스의 모든 스레드가 손상됩니다. 새로운 프로세스가 필요합니다. –

관련 문제