Nalika ngembangake aplikasi multi-threaded, biasane kita kudu ngurus ngatur karya benang. Sing luwih gedhe aplikasi kita lan luwih akeh utas sing dibutuhake kanggo tugas multithreaded, luwih akehRunnableobyek sing kita gawe.

Perlu dicathet yen nggawe thread ing Jawa iku operasi sing rada larang. Yen kita nggawe conto anyar saka thread saben wektu kanggo nindakake operasi, kita bakal nemu masalah gedhe karo kinerja lan, minangka asil, karo kesehatan saka aplikasi.

Kolam benang lan ThreadPoolExecutor teka ing kene.

Kolam utas minangka kumpulan utas sing wis diwiwiti. Ukurane bisa tetep utawa variabel.

Yen ana tugas luwih akeh tinimbang utas, tugas ngenteni ing antrian tugas. Utas Nth ing blumbang njupuk tugas saka antrian, lan sawise rampung, Utas njupuk tugas anyar saka antrian. Sawise kabeh tugas ing antrian dileksanakake, utas tetep aktif lan ngenteni tugas anyar. Nalika tugas anyar katon, utas-utas kasebut uga bakal ditindakake.

ThreadPoolExecutor

Diwiwiti karo Java 5, kerangka Executor entuk solusi multithreading. Umumé, ana akeh komponen lan tujuane kanggo mbantu kita ngatur antrian lan kolam benang kanthi efisien.

Antarmuka utama yaiku Executor lan ExecutorService .

Executor minangka antarmuka kanthi metode eksekusi void tunggal (Runnable runnable).

Nalika maringaken tugas kanggo implementasine saka cara iki, ngerti sing bakal kaleksanan asynchronously ing mangsa.

ExecutorService - Antarmuka sing ngluwihi antarmuka Executor , nambah kemampuan kanggo nglakokake tugas. Uga nduweni cara kanggo ngganggu tugas sing mlaku lan mungkasi blumbang benang.

ThreadPoolExecutor ngleksanakake antarmuka Executor lan ExecutorService lan misahake nggawe tugas saka eksekusi tugas. Kita kudu ngleksanakake obyek Runnable lan ngirim menyang eksekutor. ThreadPoolExecutorbanjur tanggung jawab nglakokake tugas, lan nggawe lan nggarap benang .

Sawise tugas dikirim kanggo eksekusi, Utas ana ing blumbang digunakake. Iki nambah kinerja. Iku solves masalah mbuang sumber daya kanggo nggawe lan initializing thread anyar, lan banjur maneh ing sampah sampah sawise kita wis rampung karo thread.

ThreadPoolExecutor nduweni 4 konstruktor:


ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)
    

Konstruktor ThreadPoolExecutor nduweni paramèter ing ngisor iki:

intiPoolSize Parameter iki nuduhake pirang-pirang utas sing bakal siap (diwiwiti) nalika layanan eksekutor diwiwiti.
maksimumPoolSize Jumlah maksimum utas sing bisa digawe dening layanan eksekutor.
keepAliveTime Wektu thread sing dibebasake bakal terus urip sadurunge dirusak yen jumlah benang luwih akeh tinimbangintiPoolSize. Unit wektu ditemtokake ing parameter sabanjure.
unit Unit wektu (jam, menit, detik, milidetik, lsp).
antrian kerja Implementasine antrian kanggo tugas.
pawang Handler kanggo tugas sing ora bisa rampung.
threadFactory Obyek sing nggawe benang anyar sing dikarepake. Nggunakake pabrik thread nggawe telpon menyang hardware thread anyar, ngidini aplikasi nggunakake subclass thread khusus, prioritas, lan liya-liyane.

Nggawe ThreadPoolExecutor

Kelas utilitas Executors bisa nyederhanakake nggawe ThreadPoolExecutor . Cara saka kelas sarana iki mbantu kita nyiyapake aThreadPoolExecutorobyek.

newFixedThreadPool - Nggawe blumbang thread sing nggunakake maneh nomer tetep thread kanggo nglakokaké sawetara tugas.

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool - Nggawe blumbang thread ing ngendi jumlah benang padha karo jumlah inti prosesor sing kasedhiya kanggo JVM. Tingkat konkurensi standar yaiku siji. Iki tegese minangka akeh Utas bakal digawe ing blumbang minangka ana intine CPU kasedhiya kanggo JVM. Yen tingkat concurrency 4, banjur Nilai liwati digunakake tinimbang nomer intine.

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor - Nggawe blumbang kanthi benang siji kanggo nglakokake kabeh tugas.

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool - Nggawe blumbang utas sing nggawe utas anyar kaya sing dibutuhake, nanging nggunakake maneh utas sing wis digawe sadurunge kasedhiya.

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool - Nggawe blumbang thread sing bisa gawe jadwal printah kanggo nglakokaké sawise wektu tundha tartamtu utawa periodik.

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

Kita bakal nimbang saben jinis blumbang ing pawulangan ing ngisor iki.