AsyncTask 內部使用固定大小的執行緒池(核心 5、最大 128、隊列 10)。在迴圈中大量 new MyAsyncTask().execute() 會迅速填滿隊列,超過 128 並發時拋出 RejectedExecutionException。
executeOnExecutor 自定義執行緒池Executor customExecutor = new ThreadPoolExecutor(
10, 50, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>()
);
for (Person p : contacts) {
new MyAsyncTask(queryString, callback).executeOnExecutor(customExecutor);
}
ThreadPoolExecutor + runOnUiThreadThreadPoolExecutor executor = new ThreadPoolExecutor(
5, 20, 10L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>()
);
for (Person p : contacts) {
executor.execute(() -> {
String result = networkRequest(queryString);
runOnUiThread(() -> updateUI(result));
});
}
Dispatchers.IO 非阻塞並發。OkHttp + 協程,棄用 AsyncTask(已棄用)。