Satu lagi jenis kumpulan tugas ialah kumpulan tugas yang dijadualkan. Berdasarkan nama, kita boleh mengandaikan bahawa kita menggunakan jenis ini untuk menjadualkan apabila tugas tertentu harus dilancarkan.

Perkhidmatan jenis ini berguna apabila kami mempunyai tugas untuk melancarkan aktiviti selepas beberapa waktu berlalu atau kami ingin menjadualkan tugasan berulang.

Untuk menggunakan satu, kami memanggil Executors.newScheduledThreadPool(1) .

Kami akan bercakap tentang parameter sedikit kemudian. Tetapi buat masa ini, apa yang perlu kita ketahui ialah apabila kaedah ini dipanggil kita mendapat objek ScheduledExecutorService .

ScheduledExecutorService ialah antara muka yang memanjangkan ExecutorService .

Kaedah berikut muncul dalam antara muka ini:

Kaedah Penjelasan

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Mencipta dan melaksanakan tindakan sekali sahaja yang dijalankan selepas kelewatan yang ditentukan.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Mencipta dan melaksanakan aScheduledFutureobjek yang dilaksanakan selepas kelewatan yang ditentukan.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Mencipta dan melaksanakan tindakan berulang yang berjalan dahulu selepas kelewatan awal yang ditentukan dan kemudian sekali lagi selepas tempoh yang ditentukan. Dalam erti kata lain, pelaksanaan akan bermula selepas initialDelay , kemudian initialDelay + period , kemudian initialDelay + 2 * period , dan seterusnya.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Mencipta dan melaksanakan tindakan berulang yang dilaksanakan terlebih dahulu selepas kelewatan awal yang ditentukan, dan kemudian sekali lagi dengan kelewatan yang ditentukan antara penyiapan satu pelaksanaan dan permulaan yang seterusnya.

Jadi antara muka membolehkan kami menjalankan tugas pada selang masa yang tetap atau selepas beberapa kelewatan.

Lagi tentang kaedah newScheduledThreadPool.

Kita boleh memanggilnya dalam beberapa cara:


newScheduledThreadPool(int corePoolSize)
corePoolSize ialah bilangan utas untuk disimpan dalam kumpulan, walaupun ia melahu.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize ialah bilangan utas untuk disimpan dalam kumpulan, walaupun ia melahu.

threadFactory ialah kilang untuk digunakan semasa membuat benang baharu.

Kedua-dua kaedah akan mencipta kumpulan benang yang boleh menjadualkan tindakan untuk dilaksanakan selepas kelewatan yang ditentukan atau secara berkala.

Mari lihat contoh untuk melihat cara ScheduledThreadPool berfungsi.

Sebagai contoh, katakan kita mempunyai tugas untuk menyemak e-mel setiap 5 saat, tetapi semakan ini tidak boleh menjejaskan program utama dan memerlukan potensi penggunaan sumber tambahan.

Kami mempunyai kelas tugas yang menyerupai menyemak e-mel.


public class Task implements Runnable {
   @Override
   public void run() {
       System.out.println("Checking email...");
   }
}

Seterusnya, kami mencipta kumpulan benang dan menjadualkan semakan.


ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);

Dalam output, setiap 5 saat kita melihat:

Menyemak e-mel...

Secara umum, kita boleh menggunakan kolam sedemikian untuk melaksanakan tugas "pengemasan" berkala, seperti dalam contoh. Tugas pengemasan adalah tugas yang mesti dilaksanakan tanpa mengira apa yang dilakukan oleh program utama.