กลุ่มงานประเภทอื่นคือกลุ่มงานที่กำหนดเวลาไว้ พิจารณาจากชื่อ เราสามารถสันนิษฐานได้ว่าเราใช้ประเภทนี้เพื่อกำหนดเวลาที่งานใดงานหนึ่งควรเริ่มทำงาน
บริการประเภทนี้มีประโยชน์เมื่อเรามีงานที่ต้องเริ่มกิจกรรมหลังจากเวลาผ่านไประยะหนึ่ง หรือเราต้องการกำหนดเวลางานที่เกิดซ้ำ
หากต้องการใช้ เราเรียกExecutors.newScheduledThreadPool (1)
เราจะพูดถึงพารามิเตอร์ในภายหลัง แต่สำหรับตอนนี้ สิ่งที่เราต้องรู้ก็คือ เมื่อเมธอดนี้ถูกเรียกใช้ เราจะได้รับออบเจกต์ScheduledExecutorService
ScheduledExecutorService เป็นอิน เทอร์เฟซที่ขยาย ExecutorService
วิธีการต่อไปนี้ปรากฏในอินเทอร์เฟซนี้:
วิธี | คำอธิบาย |
---|---|
|
สร้างและดำเนินการครั้งเดียวที่ทำงานหลังจากความล่าช้าที่ระบุ |
|
สร้างและดำเนินการกำหนดอนาคตวัตถุที่ดำเนินการหลังจากความล่าช้าที่ระบุ |
|
สร้างและดำเนินการการกระทำที่เกิดซ้ำซึ่งทำงานก่อนหลังจากเวลาหน่วงเริ่มต้นที่ระบุ และอีกครั้งหลังจากระยะเวลาที่กำหนด กล่าวอีกนัยหนึ่ง การดำเนินการจะเริ่มหลังจากinitialDelayจากนั้นinitialDelay + periodจากนั้นinitialDelay + 2 * periodและอื่น ๆ |
|
สร้างและดำเนินการการกระทำที่เกิดซ้ำซึ่งดำเนินการก่อนหลังจากความล่าช้าเริ่มต้นที่ระบุ และจากนั้นอีกครั้งด้วยความล่าช้าที่ระบุระหว่างการดำเนินการหนึ่งเสร็จสิ้นและการเริ่มต้นของการดำเนินการถัดไป |
ดังนั้นอินเทอร์เฟซจึงช่วยให้เราเรียกใช้งานตามช่วงเวลาปกติหรือหลังจากเกิดความล่าช้าได้
เพิ่มเติมเกี่ยวกับเมธอด newScheduledThreadPool
เราสามารถเรียกมันได้หลายวิธี:
|
corePoolSizeคือจำนวนของเธรดที่จะเก็บไว้ในพูล แม้ว่าจะไม่ได้ใช้งานก็ตาม |
|
corePoolSizeคือจำนวนของเธรดที่จะเก็บไว้ในพูล แม้ว่าจะไม่ได้ใช้งานก็ตาม threadFactoryเป็นโรงงานที่ใช้เมื่อสร้างเธรดใหม่ |
ทั้งสองวิธีจะสร้างเธรดพูลที่สามารถกำหนดเวลาการดำเนินการให้ดำเนินการหลังจากเวลาที่กำหนดหรือเป็นระยะๆ
ลองดูตัวอย่างเพื่อดูว่าScheduledThreadPoolทำงาน อย่างไร
ตัวอย่างเช่น สมมติว่าเรามีหน้าที่ตรวจสอบอีเมลทุกๆ 5 วินาที แต่การตรวจสอบนี้จะต้องไม่ส่งผลกระทบต่อโปรแกรมหลักและทำให้มีการใช้ทรัพยากรเพิ่มเติมที่อาจเกิดขึ้น
เรามีคลาสงานที่จำลองการตรวจสอบอีเมล
public class Task implements Runnable {
@Override
public void run() {
System.out.println("Checking email...");
}
}
ต่อไป เราสร้างเธรดพูลและกำหนดเวลาการตรวจสอบ
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);
ในผลลัพธ์ ทุก ๆ 5 วินาทีเราจะเห็น:
โดยทั่วไป เราสามารถใช้สระดังกล่าวเพื่อทำงาน "ทำความสะอาด" เป็นระยะได้ ดังตัวอย่าง งานแม่บ้านเป็นงานที่ต้องทำโดยไม่คำนึงว่าโปรแกรมหลักกำลังทำอะไรอยู่
GO TO FULL VERSION