스레드가 아닌 처리기를 사용하는 이점 / 이유는 무엇입니까?
처리기 보내고 프로세스 메시지 수와 Runnable
스레드의와 관련된 객체 MessageQueue
. 각 Handler
인스턴스는 단일 스레드 및 해당 스레드의 메시지 큐와 연관됩니다.
새를 만들면 Handler
스레드를 만드는 스레드의 스레드 / 메시지 큐에 바인딩됩니다. 이때부터 메시지와 실행 파일을 해당 메시지 큐로 전달하고 메시지 큐에서 나올 때 실행합니다. .
핸들러에는 두 가지 주요 용도가 있습니다.
- 메시지 및 Runnables 가 나중에 특정 시점에 실행되도록 예약하려면
- 자신과 다른 스레드에서 수행 할 작업 을 큐에 넣습니다 .
자바 스레드를 사용하는 경우 메인 스레드와 동기화, 스레드 취소 등 무언가를 스스로 처리해야합니다.
당신이 사용하지 않는 한이 단일 스레드는 스레드 풀을 만들지 않습니다 ThreadPoolExecutor
또는 ExecutorService
API를.
(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
작업이 단일 스레드에서 실행됩니다.
안드로이드 : 스레드 토스트