AsyncTask는 doInBackground ()에서 항목을 실행하기 위해 스레드 풀 패턴을 사용합니다. 이 문제는 초기에 (초기 Android OS 버전에서) 풀 크기가 1에 불과하여 많은 AsyncTask에 대한 병렬 계산이 없음을 의미합니다. 그러나 나중에 그들은 그 크기를 5로 고쳤으므로 최대 5 개의 AsyncTasks가 동시에 실행될 수 있습니다. 불행히도 나는 그들이 어떤 버전으로 정확하게 변경했는지 기억하지 못합니다.
최신 정보:
현재 (2012-01-27) API가 이에 대해 말한 내용은 다음과 같습니다.
처음 소개되었을 때 AsyncTasks는 단일 백그라운드 스레드에서 순차적으로 실행되었습니다. DONUT부터는 여러 작업을 병렬로 수행 할 수있는 스레드 풀로 변경되었습니다. HONEYCOMB 후에는 병렬 실행으로 인한 일반적인 응용 프로그램 오류를 피하기 위해이를 단일 스레드로 다시 변경할 계획입니다. 병렬 실행을 원한다면 THREAD_POOL_EXECUTOR와 함께이 메소드의 executeOnExecutor (Executor, Params ...) 버전을 사용할 수 있습니다. 그러나 사용에 대한 경고는 주석을 참조하십시오.
DONUT는 Android 1.6이고 HONEYCOMB은 Android 3.0입니다.
업데이트 : 2
에 의해 코멘트보기 kabuko
에서을 Mar 7 2012 at 1:27
.
"여러 작업을 병렬로 실행할 수있는 스레드 풀"이 사용되는 API (1.6에서 시작하여 3.0으로 끝남)가 동시에 실행되는 AsyncTask의 수는 이미 실행을 위해 전달 된 작업 수에 따라 다릅니다. 그들의 완료되지 않은 doInBackground()
아직.
이것은 2.2에서 나에 의해 테스트 / 확인되었습니다. 에 잠 들어있는 사용자 지정 AsyncTask가 있다고 가정합니다 doInBackground()
. AsyncTask는 지연된 작업을 저장하기 위해 내부적으로 고정 크기 대기열을 사용합니다. 대기열 크기는 기본적으로 10입니다. 15 개의 사용자 지정 작업을 연속으로 시작하면 처음 5 개는에 입력 doInBackground()
하지만 나머지는 대기열에서 비어있는 작업자 스레드를 기다립니다. 처음 5 개 중 하나가 완료되고 작업자 스레드를 해제하면 대기열의 작업이 실행을 시작합니다. 따라서이 경우 최대 5 개의 작업이 동시에 실행됩니다. 그러나 16 개의 사용자 지정 작업을 연속으로 시작하면 처음 5 개가로 들어가고 doInBackground()
나머지 10 개가 대기열에 들어가지만 16 일 동안 새 작업자 스레드가 만들어져 즉시 실행을 시작합니다. 따라서이 경우 최대 6 개의 작업이 동시에 실행됩니다.
동시에 실행할 수있는 작업 수에는 제한이 있습니다. 이후 AsyncTask
사용하는 작업자 스레드 (128) 및 당신이 충돌합니다 이상 138 사용자 정의 작업 응용 프로그램을 실행하려고하면 큐, 크기 10 고정했다 지연된 작업의 제한 최대 수의 스레드 풀 실행자 java.util.concurrent.RejectedExecutionException
.
3.0부터 API는 AsyncTask.executeOnExecutor(Executor exec, Params... params)
메소드 를 통해 사용자 정의 스레드 풀 실행기를 사용할 수 있습니다 . 예를 들어, 기본값 10이 필요한 경우 지연된 작업 큐의 크기를 구성 할 수 있습니다.
@Knossos가 언급했듯이 AsyncTaskCompat.executeParallel(task, params);
지원 v.4 라이브러리에서 API 수준을 방해 하지 않고 작업을 병렬로 실행 하는 옵션이 있습니다 . 이 메소드는 API 레벨 26.0.0에서 더 이상 사용되지 않습니다.
업데이트 : 3
https://github.com/vitkhudenko/test_asynctask : 다음은 일련의 작업, 병렬 및 병렬 실행을 함께 수행하는 간단한 테스트 응용 프로그램입니다.
업데이트 : 4 (이 점을 지적한 @penkzhou에게 감사드립니다)
Android 4.4부터는 UPDATE : 2 섹션 AsyncTask
에서 설명한 것과 다르게 작동 합니다. 너무 많은 스레드를 작성 하지 못하게 하는 수정 사항 이 있습니다 .AsyncTask
Android 4.4 (API 19) AsyncTask
이전에는 다음 필드가있었습니다.
private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(10);
Android 4.4 (API 19)에서 위의 필드가 다음으로 변경되었습니다.
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
이 변경으로 큐 크기는 128 개 항목으로 증가하고 최대 스레드 수는 CPU 코어 수 * 2 + 1로 줄어 듭니다. 앱은 여전히 동일한 수의 작업을 제출할 수 있습니다.