กลุ่มงานประเภทอื่นคือกลุ่มงานที่กำหนดเวลาไว้ พิจารณาจากชื่อ เราสามารถสันนิษฐานได้ว่าเราใช้ประเภทนี้เพื่อกำหนดเวลาที่งานใดงานหนึ่งควรเริ่มทำงาน

บริการประเภทนี้มีประโยชน์เมื่อเรามีงานที่ต้องเริ่มกิจกรรมหลังจากเวลาผ่านไประยะหนึ่ง หรือเราต้องการกำหนดเวลางานที่เกิดซ้ำ

หากต้องการใช้ เราเรียกExecutors.newScheduledThreadPool (1)

เราจะพูดถึงพารามิเตอร์ในภายหลัง แต่สำหรับตอนนี้ สิ่งที่เราต้องรู้ก็คือ เมื่อเมธอดนี้ถูกเรียกใช้ เราจะได้รับออบเจกต์ScheduledExecutorService

ScheduledExecutorService เป็นอิน เทอร์เฟซที่ขยาย ExecutorService

วิธีการต่อไปนี้ปรากฏในอินเทอร์เฟซนี้:

วิธี คำอธิบาย

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
สร้างและดำเนินการครั้งเดียวที่ทำงานหลังจากความล่าช้าที่ระบุ

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
สร้างและดำเนินการกำหนดอนาคตวัตถุที่ดำเนินการหลังจากความล่าช้าที่ระบุ

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
สร้างและดำเนินการการกระทำที่เกิดซ้ำซึ่งทำงานก่อนหลังจากเวลาหน่วงเริ่มต้นที่ระบุ และอีกครั้งหลังจากระยะเวลาที่กำหนด กล่าวอีกนัยหนึ่ง การดำเนินการจะเริ่มหลังจากinitialDelayจากนั้นinitialDelay + periodจากนั้นinitialDelay + 2 * periodและอื่น ๆ

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
สร้างและดำเนินการการกระทำที่เกิดซ้ำซึ่งดำเนินการก่อนหลังจากความล่าช้าเริ่มต้นที่ระบุ และจากนั้นอีกครั้งด้วยความล่าช้าที่ระบุระหว่างการดำเนินการหนึ่งเสร็จสิ้นและการเริ่มต้นของการดำเนินการถัดไป

ดังนั้นอินเทอร์เฟซจึงช่วยให้เราเรียกใช้งานตามช่วงเวลาปกติหรือหลังจากเกิดความล่าช้าได้

เพิ่มเติมเกี่ยวกับเมธอด newScheduledThreadPool

เราสามารถเรียกมันได้หลายวิธี:


newScheduledThreadPool(int corePoolSize)
corePoolSizeคือจำนวนของเธรดที่จะเก็บไว้ในพูล แม้ว่าจะไม่ได้ใช้งานก็ตาม

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

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 วินาทีเราจะเห็น:

กำลังตรวจสอบอีเมล...

โดยทั่วไป เราสามารถใช้สระดังกล่าวเพื่อทำงาน "ทำความสะอาด" เป็นระยะได้ ดังตัวอย่าง งานแม่บ้านเป็นงานที่ต้องทำโดยไม่คำนึงว่าโปรแกรมหลักกำลังทำอะไรอยู่