Ang isa pang uri ng task pool ay ang naka-iskedyul na task pool. Sa paghusga sa pangalan, maaari nating ipagpalagay na ginagamit natin ang ganitong uri upang mag-iskedyul kung kailan dapat ilunsad ang isang partikular na gawain.

Ang ganitong uri ng serbisyo ay kapaki-pakinabang kapag mayroon kaming gawain na maglunsad ng aktibidad pagkalipas ng ilang oras o gusto naming mag-iskedyul ng umuulit na gawain.

Upang gumamit ng isa, tinatawagan namin ang Executors.newScheduledThreadPool(1) .

Pag-uusapan natin ang mga parameter sa ibang pagkakataon. Ngunit sa ngayon, ang kailangan nating malaman ay kapag tinawag ang pamamaraang ito, nakakakuha tayo ng object na ScheduledExecutorService .

Ang ScheduledExecutorService ay isang interface na nagpapalawak ng ExecutorService .

Lumilitaw ang mga sumusunod na pamamaraan sa interface na ito:

Pamamaraan Paliwanag

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Gumagawa at nagsasagawa ng isang beses na pagkilos na tumatakbo pagkatapos ng tinukoy na pagkaantala.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Lumilikha at nagsasagawa ng aScheduledFuturebagay na isinasagawa pagkatapos ng isang tinukoy na pagkaantala.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Gumagawa at nagsasagawa ng umuulit na pagkilos na unang tatakbo pagkatapos ng tinukoy na paunang pagkaantala at pagkatapos ay muli pagkatapos ng tinukoy na panahon. Sa madaling salita, magsisimula ang pagpapatupad pagkatapos ng initialDelay , pagkatapos ay initialDelay + period , pagkatapos ay initialDelay + 2 * period , at iba pa.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Gumagawa at nagsasagawa ng paulit-ulit na pagkilos na unang nagsasagawa pagkatapos ng tinukoy na paunang pagkaantala, at pagkatapos ay muli sa tinukoy na pagkaantala sa pagitan ng pagkumpleto ng isang pagpapatupad at pagsisimula ng susunod.

Kaya hinahayaan kami ng interface na magpatakbo ng mga gawain sa mga regular na pagitan o pagkatapos ng ilang pagkaantala.

Higit pa sa newScheduledThreadPool na paraan.

Maaari nating tawagan ito sa maraming paraan:


newScheduledThreadPool(int corePoolSize)
Ang corePoolSize ay ang bilang ng mga thread na dapat panatilihin sa pool, kahit na sila ay idle.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

Ang corePoolSize ay ang bilang ng mga thread na dapat panatilihin sa pool, kahit na sila ay idle.

Ang threadFactory ay ang factory na gagamitin kapag gumagawa ng mga bagong thread.

Ang parehong mga pamamaraan ay lilikha ng isang thread pool na maaaring mag-iskedyul ng mga aksyon na isasagawa pagkatapos ng isang tinukoy na pagkaantala o pana-panahon.

Tingnan natin ang isang halimbawa upang makita kung paano gumagana ang ScheduledThreadPool .

Halimbawa, ipagpalagay na mayroon kaming gawain na suriin ang email bawat 5 segundo, ngunit ang pagsusuring ito ay hindi dapat makaapekto sa pangunahing programa at nangangailangan ng potensyal na pagkonsumo ng mga karagdagang mapagkukunan.

Mayroon kaming klase ng gawain na ginagaya ang pagsuri sa email.


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

Susunod, gumawa kami ng thread pool at iiskedyul ang tseke.


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

Sa output, bawat 5 segundo makikita natin ang:

Sinusuri ang email...

Sa pangkalahatan, maaari naming gamitin ang naturang pool upang magsagawa ng mga pana-panahong gawaing "housekeeping", tulad ng sa halimbawa. Ang mga gawain sa housekeeping ay mga gawain na dapat gampanan anuman ang ginagawa ng pangunahing programa.