2012-03-14 2 views
6

메인 스레드를 멈추지 않고 안드로이드 응용 프로그램에서 실행중인 모든 작업자 스레드를 중지하는 방법은 무엇입니까?안드로이드 응용 프로그램에서 모든 작업자 스레드를 중지하는 방법

예를 들면?

+0

메인 스레드를 중지하면 무엇을 의미합니까? 작업자 스레드로 무엇을 의미합니까? – Blackbelt

+0

관련 항목을 검색하려고 시도 했습니까? StackOverflow에는 멋진 검색 도구가 있습니다.귀하의 질문은 이해하기 쉽지 않습니다. 설명해주십시오. –

답변

1

에 응답하지 않는 경우 스레드를 막을 수있는 방법을 제공, 그나마 읽고 다시 게시하시기 바랍니다, 스레드에 대한 톤을 이야기한다.

할 수 있습니다 만 interrupt 스레드하지만 sleep, wait 등과 같은 방해 할 수있는 상태에있는 스레드해야 ...

또는 스레드 던져 예외를 만들기 위해 몇 가지 트릭을 사용 할 수 예 :

스레드가 네트워크에 연결되어 있으면 스레드를 중지하고 네트워크 연결을 닫고 ioexception을 throw합니다.

스레드가 파일을 읽으면 스트림을 닫아 ioexception을 throw 할 수 있습니다.

스레드가 데이터베이스를 쿼리입니다 3.If는

, 당신은

이 그래서 스레드의 작업에 따라 데이터베이스를 닫을 수 있습니다.

1

실제로 스레드의 메서드는 stop()이므로 모든 작업자 스레드를 거쳐 각각에 대해이 메서드를 호출 할 수 있습니다.

질문은 "작업자 스레드 목록을 구할 수 있습니까?"입니다. 더 나은 솔루션은 응용 프로그램 수준의 어딘가에이 목록을 저장하는 것입니다. 즉, 작업자 스레드를 생성 할 때마다 특수 목록에 넣으십시오. 이것은 스레드가 "작업자"스레드라는 것을 알고 있기 때문에 더 나은 솔루션입니다.

하지만 이론적으로는 응용 프로그램을 동적으로 검색하고 스레드를 검색 할 수도 있습니다. 제공된 배열을 채우는 정적 메서드 Thread.enumerate(Thread[] threads)이 있습니다. 그러나 얼마나 많은 스레드가 현재 실행되고 있는지를 아는 방법은 무엇입니까? Thread.activeCount()을 사용하십시오.

Thread[] threads = new Thread[Thread.activeCount()]; 
Thread.enumerate(threads); 
for (Thread t : threads) { 
    if (isWorkerThread(t)) { 
     t.stop(); 
    } 
} 

작업자 스레드를 식별하는 것은 사용자의 책임입니다. 예를 들어 스레드의 이름이나 스레드의 스택 추적을 사용할 수 있습니다.

그러나 권장되지 않는 방법 stop()을 호출하는 것은 범죄입니다. 이유에 대해서는이 메소드의 javadoc을 참조하십시오.

"올바른"방법은 응용 프로그램 계층에서 정상적인 종료 메커니즘을 구현하는 것입니다. 각 스레드는 스레드가 종료되어야하는지 여부와 플래그가 참인 경우에만 run() 메서드에서 반환하는 플래그를 확인해야합니다. 이 경우 작업 스레드를 닫는 것은 매우 간단합니다.이 플래그의 값을 true로 설정하면 스레드가 종료됩니다. 이것은 "올바른"해결책입니다.

관련 문제