ข้อดี / เหตุผลในการใช้ Handler ไม่ใช่ Thread คืออะไร?
Handlerช่วยให้คุณส่งข้อความและกระบวนการและวัตถุที่เกี่ยวข้องกับของด้ายRunnable
MessageQueue
แต่ละHandler
อินสแตนซ์เชื่อมโยงกับเธรดเดียวและคิวข้อความของเธรดนั้น
เมื่อคุณสร้างใหม่Handler
จะถูกผูกไว้กับเธรด / คิวข้อความของเธรดที่กำลังสร้างเธรด - จากจุดนั้นเป็นต้นไปมันจะส่งข้อความและ runnables ไปยังคิวข้อความนั้นและดำเนินการตามที่ออกมาจากคิวข้อความ .
การใช้งานหลัก ๆ สองประการสำหรับ Handler:
- เพื่อกำหนดเวลาข้อความและRunnablesที่จะดำเนินการเป็นบางประเด็นในอนาคต
- เพื่อจัดคิวการดำเนินการกับเธรดอื่นที่ไม่ใช่ของคุณเอง
หากคุณใช้เธรด java คุณต้องจัดการบางอย่างด้วยตัวคุณเองเช่นการซิงโครไนซ์กับเธรดหลักการยกเลิกเธรดเป็นต้น
เธรดเดี่ยวนี้ไม่ได้สร้างเธรดพูลเว้นแต่คุณจะใช้ThreadPoolExecutor
หรือExecutorService
API
(นำคำถามนี้มาจากความคิดเห็นของคุณเกี่ยวกับคำตอบของ Blackbelt)
ทำไมไม่ใช้ Executor? และแม้ว่าฉันต้องการใช้ Handler เพื่อทำสิ่งนั้นอย่างไร
อ้างอิง: บทความประสิทธิภาพของเธรด
มีงานบางประเภทที่สามารถลดลงเป็นงานแบบกระจายขนานกันได้มาก ด้วยจำนวนแพ็คเก็ตงานที่แท้จริงสิ่งนี้จะสร้างขึ้น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
งานทั้งหมดจะทำงานในเธรดเดียว
Android: ปิ้งในกระทู้