스레드가 아닌 처리기를 사용하는 이점 / 이유는 무엇입니까?
처리기 보내고 프로세스 메시지 수와 Runnable스레드의와 관련된 객체 MessageQueue. 각 Handler인스턴스는 단일 스레드 및 해당 스레드의 메시지 큐와 연관됩니다.
새를 만들면 Handler스레드를 만드는 스레드의 스레드 / 메시지 큐에 바인딩됩니다. 이때부터 메시지와 실행 파일을 해당 메시지 큐로 전달하고 메시지 큐에서 나올 때 실행합니다. .
핸들러에는 두 가지 주요 용도가 있습니다.
- 메시지 및 Runnables 가 나중에 특정 시점에 실행되도록 예약하려면
- 자신과 다른 스레드에서 수행 할 작업 을 큐에 넣습니다 .
자바 스레드를 사용하는 경우 메인 스레드와 동기화, 스레드 취소 등 무언가를 스스로 처리해야합니다.
당신이 사용하지 않는 한이 단일 스레드는 스레드 풀을 만들지 않습니다 ThreadPoolExecutor또는 ExecutorServiceAPI를.
(Blackbelt 답변에 대한 귀하의 의견 에서이 쿼리를 가져 왔습니다)
왜 집행자를 사용하지 않습니까? 처리기를 사용하여 그렇게하고 싶더라도 어떻게해야합니까?
참조 : 스레드 성능 기사
고도의 병렬 분산 작업으로 줄일 수있는 특정 유형의 작업이 있습니다. 작품의 엄청난 양이 (가) 작성하는 패킷, AsyncTask그리고 HandlerThread적절한 클래스하지 않습니다. 단일 스레드 특성은 AsyncTask모든 스레드 풀 작업을 선형 시스템으로 전환합니다. HandlerThread반면에 클래스를 사용하려면 프로그래머가 스레드 그룹 간의로드 밸런싱을 수동으로 관리해야합니다.
ThreadPoolExecutor 는이 과정을보다 쉽게 해주는 도우미 클래스입니다. 이 클래스는 스레드 그룹 작성을 관리하고 우선 순위를 설정하며 스레드간에 작업이 분배되는 방식을 관리합니다. 워크로드가 증가하거나 감소함에 따라 클래스는 더 많은 스레드를 스핀 업 또는 파괴하여 워크로드에 맞 춥니 다.
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
자세한 내용 은 create-threadpool에 대한 이 개발자 안내서 를 참조하십시오.
Handler여러 개의 Runnable 인스턴스를 실행하는 방법에 대해서는이 게시물을 살펴보십시오 . 이 경우 모든 Runnable작업이 단일 스레드에서 실행됩니다.
안드로이드 : 스레드 토스트