2012-09-06 5 views
0

스레드를 시작하기 위해 서비스를 사용했습니다. while 루프를 작성했습니다 (플래그를 설정하고 플래그는 true, 스레드는 실행, 플래그가 false이면 스레드는 아무것도하지 않으며, 따라서 스레드를 수동으로 중지하십시오.) 코드를 디버깅 할 때 종종 스레드가 끝났음을 알았지 만 서비스는 계속 실행 중입니다. 그것은 안드로이드 시스템에 의해 재활용됩니까?안드로이드에서 Thread를 사용하는 것이 안전하지 않습니까?

쓰레드가 재활용되지 않도록하려면 어떻게해야합니까?

은 ======

는 "스레드에 의해 자동으로 종료되기 전에 시스템에 의해 정리 될 것"

편집 =======는 - 그것은 안 될 때 스레드가 살해되는 것을 의미

+2

이것은 나에게 많은 의미가 없습니다. 아마도 당신이하고있는 일을 설명하기 위해 몇 가지 코드를 포함시켜야 할 것입니다. –

+0

재활용이란 일부 사람들에게 쓰레기 수거를 의미합니다. 아마도 그 사람이 말한 것입니다. "끝나기 전에 쓰레드가 자동으로 시스템에 의해 정리 될 것입니다."- 그래서 그의 문제는 스레드가 죽어서는 안되었을 때 죽이는 것입니다. – RobertMaysJr

답변

1

루프에서 Thread.yield()를 호출하면 시스템에서 다른 작업을 수행 할 수 있습니까? NOT- 다음 안드로이드가 100 %의 CPU 사용량을 소모하기위한 스레드를 죽일 수 있다면 - 그것은 간단한 루프의 경우 스택 추적이 때문에 변경되지는 않습니다 것은 스크립트 걸려

http://developer.android.com/reference/java/lang/Thread.html#yield()

수익률 ()는 스레드 실행 프로그램에게 스레드가 루프하지 않고 다른 스레드를 중지하고 실행해야한다고 알려줍니다. 루프가 없으면 루프가 다른 응용 프로그램의 리소스를 훔칩니다.

플래그가 특정 응용 프로그램에서 변경되지 않을 것이라는 확신이 들면 시간 금액

편집 - 배경 - 안드로이드가 끊어진 스레드를 감지하는 방법입니다. - 스레드가 CPU의 100 %를 차지하면 파일에 스택 추적을 덤프하고 짧은 시간 동안 대기 한 다음 다른 스택 추적을 덤프합니다. 두 개의 일치하는 경우 코드가 실행을 멈추고 활동에 대해 ANR 'xx is not responsing'대화 상자를 실행하거나 서비스 인 경우 자동으로 종료하고 다시 시작합니다.

자발적으로 100 % 소비하지 못하게함으로써 절대로 시도하지 않습니다.

+0

나중에 yield()를 시도하겠습니다. 어쩌면 이것이 이유 일 것입니다. 재활용을 통해 '쓰레기 수거'를 의미합니다. – Wesley

+0

감사합니다. yield() worked! – Wesley

+0

참고 :이 작업을 수행하는 가비지 수집기가 아닙니다! –

0

코드가 무엇을하고 있는지, 그리고 어떤 일이 일어나야한다고 생각하는지는 분명하지 않습니다. 그러나 우리가 즉시 정리할 수있는 한 가지가 있습니다.

Java (및 Android)의 스레드는 "재생"하지 않습니다. 스레드의 run() 메소드가 끝나면 (반환 또는 일부 예외가 전파되도록 허용하여) 다시 시작하지 않습니다. 절대로.

또한 스레드는 실행 중일 때 가비지 수집되지 않습니다. 가비지 콜렉션은 스레드를 종료시킬 수 없습니다.

+0

재활용은 어떤 사람들에게 '쓰레기 수거'를 의미합니다 - 아마도 그가 말하는 내용 일 것입니다. "스레드가 자동으로 시스템에서 정리할 것인가" – RobertMaysJr

+0

재활용은 가비지 수집을 의미합니다. 코드가이 컴퓨터에 없습니다. @RobertMaysJr의 방법을 먼저 시도해 보겠습니다. 작동하지 않으면 코드가 표시됩니다. 고마워요 – Wesley

+0

컨텍스트에 따라 생각해 보았습니다 :-) 왜 @StephenC이 스레드를 "재사용"할 수 있다고 생각했는지 봅니다 ...내가 모든 당신이 재활용 방법에 따라 달라집니다 것 같아요 (다른 쓰레기통에 던져 경우 새로운 가두 픽업 할 수 단순히 재사용 물건을 자신의 구식 방법 대) ;-) – RobertMaysJr

관련 문제