AsyncTask ใช้รูปแบบกลุ่มเธรดสำหรับการเรียกใช้เนื้อหาจาก doInBackground () ปัญหาคือเริ่มต้น (ในรุ่น Android OS ต้น) ขนาดพูลเป็นเพียง 1 ซึ่งหมายถึงไม่มีการคำนวณแบบขนานสำหรับ AsyncTasks แต่ต่อมาพวกเขาก็แก้ไขและตอนนี้ขนาดคือ 5 ดังนั้นอย่างมากที่สุด 5 AsyncTasks สามารถทำงานพร้อมกัน น่าเสียดายที่ฉันจำไม่ได้ว่าพวกเขาเปลี่ยนรุ่นอะไร
UPDATE:
นี่คือสิ่งที่ปัจจุบัน (2012-01-27) API พูดเกี่ยวกับสิ่งนี้:
เมื่อเปิดตัวครั้งแรก AsyncTasks จะถูกดำเนินการตามลำดับบนเธรดพื้นหลังเดียว เริ่มต้นด้วย DONUT สิ่งนี้ถูกเปลี่ยนเป็นกลุ่มของเธรดที่อนุญาตให้งานหลายอย่างทำงานพร้อมกัน หลังจาก HONEYCOMB มีการวางแผนที่จะเปลี่ยนกลับไปเป็นเธรดเดี่ยวเพื่อหลีกเลี่ยงข้อผิดพลาดทั่วไปของแอปพลิเคชันที่เกิดจากการเรียกใช้แบบขนาน หากคุณต้องการการประมวลผลแบบขนานอย่างแท้จริงคุณสามารถใช้รุ่น executeOnExecutor (Executor, Params ... ) ของวิธีนี้ด้วย THREAD_POOL_EXECUTOR อย่างไรก็ตามดูความเห็นที่นั่นสำหรับคำเตือนในการใช้งาน
โดนัทเป็น Android 1.6, HONEYCOMB เป็น Android 3.0
อัปเดต: 2
ดูความคิดเห็นโดยจากkabuko
Mar 7 2012 at 1:27
ปรากฎว่าสำหรับ APIs ที่ใช้ "กลุ่มของเธรดที่อนุญาตให้ใช้งานหลายงานพร้อมกัน" (เริ่มจาก 1.6 และสิ้นสุดที่ 3.0) จำนวนการทำงานพร้อมกันของ AsyncTasks ขึ้นอยู่กับจำนวนงานที่ผ่านการดำเนินการแล้ว แต่ ยังไม่เสร็จสิ้นของพวกเขาdoInBackground()
เลย
นี่คือการทดสอบ / ยืนยันโดยฉันใน 2.2 สมมติว่าคุณมี AsyncTask doInBackground()
ที่กำหนดเองที่เพิ่งหลับเป็นครั้งที่สองใน AsyncTasks ใช้คิวขนาดคงที่ภายในเพื่อจัดเก็บงานที่ล่าช้า ขนาดคิวคือ 10 ตามค่าเริ่มต้น หากคุณเริ่มงานที่กำหนดเอง 15 รายการของคุณในแถวจากนั้น 5 อันดับแรกจะเข้าสู่งานของพวกเขาdoInBackground()
แต่ส่วนที่เหลือจะรอในคิวของเธรดผู้ทำงานอิสระ ทันทีที่หนึ่งใน 5 ครั้งแรกเสร็จสิ้นดังนั้นจึงปล่อยเธรดผู้ปฏิบัติงานงานจากคิวจะเริ่มดำเนินการ ดังนั้นในกรณีนี้มากที่สุด 5 งานจะทำงานพร้อมกัน อย่างไรก็ตามถ้าคุณเริ่มงานที่กำหนดเอง 16 รายการของคุณในแถวจากนั้น 5 อันดับแรกจะเข้าสู่งานของพวกเขาdoInBackground()
ส่วนที่เหลือ 10 จะเข้าสู่คิว แต่สำหรับวันที่ 16 จะมีการสร้างเธรดคนงานใหม่เพื่อที่จะเริ่มดำเนินการทันที ดังนั้นในกรณีนี้ที่มากที่สุด 6 งานจะทำงานพร้อมกัน
มีการ จำกัด จำนวนงานที่สามารถเรียกใช้พร้อมกันได้ ตั้งแต่AsyncTask
ใช้ปฏิบัติการสระว่ายน้ำหัวข้อที่มี จำกัด จำนวนสูงสุดของหัวข้อการปฏิบัติงาน (128) และงานล่าช้าคิวได้กำหนดขนาด 10 ถ้าคุณพยายามที่จะดำเนินการมากกว่า 138 งานของคุณเอง app 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 AsyncTask
ทำงานแตกต่างจากสิ่งที่ได้อธิบายไว้ในUPDATE: 2ส่วน มีการแก้ไขเพื่อป้องกันไม่ให้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 แอปยังคงสามารถส่งงานจำนวนเดียวกันได้