JavaRush /Kurslar /All lectures for TK purposes /newCachedThreadPool Metody

newCachedThreadPool Metody

All lectures for TK purposes
Dereje , Sapak
Elýeterli

Başga bir tok bolsa – cached type. Bu toklar, ulanylyşy boýunça, fixed ýaly giňden ulanylýar.

Toklar cached edilýär, şonuň üçin ady şeýle. Ony işjeň (ulanylmaýan) saklaýar, belli bir wagta çenli, täze işleriň ýerine ýetirilmegi üçin bu toklar ulanylmaly. Şeýle toklar, ýerine ýetirmek üçin belli bir akyl ýetirilýän mukdarda ýeňil işler bar bolsa, iň gowusy ulanylýar.

"Akyl ýetirilýän mukdar" düşünmesi örän uzyn, emma belli bir mukdar işler üçin bu toklar ähli ýagdaýa laýyk däl. Mysal üçin, million iş yaratmak isleýän bolsak, olaryň hersi örän az wagt alýan bolsa hem, resurslary esassyz ulanyp, öndürijiligi peseldýäris. Şeýle hem, iş wagty öñünden çak edilmedik ýagdaýlarda, meselem, giriş-çykaryş işlerinde, bu tokdan gaça durmaly.

Python aşagyndaky gurşawda ThreadPoolExecutor konstruktory aşakdaky parametrler bilen çaýrylýar:


public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, 
      new SynchronousQueue<Runnable>());
}

Konstruktor üçin parametrler hökmünde şu bahalar berilýär:

Parametr Bahasy
corePoolSize (executor hyzmatynyň başlangyjy üçin taýýar (išläp) bolar tok mukdary) 0
maximumPoolSize (executor hyzmatynyň döredip biljek tok mukdary) Integer.MAX_VALUE
keepAliveTime (Toklaryň sany corePoolSizedan köp bolsa, boş tok näçe wagt ýaşar we soňra ýykylýar) 60L
unit (Wagt ölçeg birligi) TimeUnit.SECONDS
workQueue (Nobatyň ýerine ýetirilmegi) new SynchronousQueue<Runnable>()

Başga parametro hökmünde biz öz ThreadFactory implementasiýamyzy berip bileris.

SynchronousQueue hakda gürleşeli

Synchronize geçiriliş ýatlaň örän sada, şol bir wagtyň özünde sezgileriňe garşy bolup biler (duýgy, aňdyrma, ýa-da duýgurlyk bilen baha berilende dogry däl ýaly görünýän): bir ýük diňe we diňe başga bir tok şol ýüküň kabul edýän wagty alýar. Başgaça aýtsak, sichronizirlenen nobatda dürli işler bolup bilmez, sebäbi täze iş kabul edilende, ýerine ýetiriji tok şol işi eýýäm alýar.

Täze iş nobata giren wagty, eger tokda boş ýer bolsa, tok şol işi alýar, eger ähli toklar meşgul bolsa — täze tok döredilýär.

Cached tok noýba toklar dolandyrylmagynda, esasanda ýagdaýa gönükdirilenligi bilen, giňden ulanylýar.

Sistem resurslaryny dolandyrmak üçin, cached toklar bir minutlap iş bolmadyk tokary ýykýarlar.

Gelin muňa tejribede barlap göreli, biz ulanyjynyň soragyna modelleşdirýän iş klassyny döredýäris:


public class Task implements Runnable {
   int taskNumber;

   public Task(int taskNumber) {
       this.taskNumber = taskNumber;
   }

   @Override
   public void run() {
       System.out.println("Ulanyjynyň soragy işledildi №" + taskNumber + " tokda " + Thread.currentThread().getName());
   }
}
    

main içinde biz newCachedThreadPool döredýäris, soň 3 işi ýerine ýetirmäge goşýarys. Şu ýerde hyzmatymyz ýagdaýyny görkezýäris (1).

Soň 30 sekuntda togtadýarys, soň başga bir işi ýerine ýetirmäge goýýarys we ýagdaýy görkezýäris (2).

Soňra esasy tokumyzy 70 sekunda togtadýarys, ýagdaýy görkezýäris (3) we täze 3 işi ýerine ýetirmäge goşýarys we ýagdaýy gaýtadan çap edýäris (4).

Ýagdaýlary çap etmezden öň, işi goşandan soň, häzirki netijäni görkezmek üçin sleep 1 sekunda goýarys.


ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 3; i++) {
            executorService.submit(new Task(i));
        }
 
        TimeUnit.SECONDS.sleep(1);
            System.out.println(executorService);	//(1)
 
        TimeUnit.SECONDS.sleep(30);
 
        executorService.submit(new Task(3));
        TimeUnit.SECONDS.sleep(1);
            System.out.println(executorService);	//(2)
 
        TimeUnit.SECONDS.sleep(70);
 
            System.out.println(executorService);	//(3)
 
        for (int i = 4; i < 7; i++) {
            executorService.submit(new Task(i));
        }
 
        TimeUnit.SECONDS.sleep(1);
            System.out.println(executorService);	//(4)
        executorService.shutdown();

Şeýlelikde, ýerine ýetirişiň netijesi:

Ulanyjynyň soragy işledildi №0 tokda pool-1-thread-1
Ulanyjynyň soragy işledildi №1 tokda pool-1-thread-2
Ulanyjynyň soragy işledildi №2 tokda pool-1-thread-3
(1) java.util.concurrent.ThreadPoolExecutor@f6f4d33[Running, pool size = 3, active threads = 0, queued tasks = 0, completed tasks = 3]
Ulanyjynyň soragy işledildi №3 tokda pool-1-thread-2
(2) java.util.concurrent.ThreadPoolExecutor@f6f4d33[Running, pool size = 3, active threads = 0, queued tasks = 0, completed tasks = 4]
(3) java.util.concurrent.ThreadPoolExecutor@f6f4d33[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 4]
Ulanyjynyň soragy işledildi №4 tokda pool-1-thread-4
Ulanyjynyň soragy işledildi №5 tokda pool-1-thread-5
Ulanyjynyň soragy işledildi №6 tokda pool-1-thread-4
(4) java.util.concurrent.ThreadPoolExecutor@f6f4d33[Running, pool size = 2, active threads = 0, queued tasks = 0, completed tasks = 7]

Her ädimde näme bolandygyny derňeýeli:

Ädim Görkezme
1 (3 işden soň) 3 tok döredildi, şol 3 tokda 3 iş ýerine ýetirildi.
Ähli işler ýerine ýetirildi, toklar başga iş berilende taýýar.
2 (30 sekundan soň we başga bir iş ýerine ýetirilenden soň) 30 sekunt passiwlikden soň toklar iş üçin taýýar we garaýar.
Başga bir iş goşulýar we tok birligi bilen ýerine ýetirilýär.
Täze tok bu eýýäm bar bolan tok içinde gurlan oturan zadyny ýerine ýetirdi.
3 (70 sekund passiwlikden soň) Toklar tok havuzyndan aýryldy.
Taýýar iş kabul etmek üçin tok ýok.
4 (3 işden soň) Iň soňky işleriň ýerine ýetirilmegi bilen, iki tok täze işler ýerine ýetirdi.

Şeýlelikde, biz başga ýönekeý tok dolandyryş hyzmatynyň iş prinsipi bilen tanyş bolduk.

Executors klasasynyň newCachedThreadPool metody, ýörite ThreadFactory obýekti geçýär.

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION