Apabila membangunkan aplikasi berbilang benang, biasanya kita mesti berurusan dengan mengatur kerja benang. Lebih besar aplikasi kita dan lebih banyak benang yang kita perlukan untuk tugas berbilang benang, lebih banyakBoleh dijalankanobjek yang kita cipta.

Perlu diingatkan di sini bahawa membuat benang di Jawa adalah operasi yang agak mahal. Jika kami membuat contoh baru bagi urutan setiap kali untuk melaksanakan operasi, kami akan mendapat masalah besar dengan prestasi dan, akibatnya, dengan kesihatan aplikasi.

Kumpulan benang dan ThreadPoolExecutor datang membantu kami di sini.

Kumpulan benang ialah satu set benang yang dipramulakan. Saiznya boleh tetap atau berubah-ubah.

Jika terdapat lebih banyak tugas daripada utas, maka tugasan menunggu dalam baris gilir tugas. Benang Nth dalam kumpulan mengambil tugasan daripada baris gilir, dan selepas ia selesai, utas itu mengambil tugasan baharu daripada baris gilir. Setelah semua tugasan dalam baris gilir dilaksanakan, utas akan kekal aktif dan menunggu tugasan baharu. Apabila tugasan baharu muncul, utas mula melaksanakannya juga.

ThreadPoolExecutor

Bermula dengan Java 5, rangka kerja Pelaksana memperoleh penyelesaian multithreading. Secara umum, ia mempunyai banyak komponen dan tujuannya adalah untuk membantu kami menguruskan baris gilir dan kumpulan benang dengan cekap.

Antara muka utama ialah Executor dan ExecutorService .

Pelaksana ialah antara muka dengan kaedah laksanakan kekosongan tunggal (boleh dijalankan boleh dijalankan).

Apabila menghantar tugas kepada pelaksanaan kaedah ini, ketahui bahawa ia akan dilaksanakan secara tak segerak pada masa hadapan.

ExecutorService — Antara muka yang memanjangkan antara muka Pelaksana , menambah keupayaan untuk melaksanakan tugas. Ia juga mempunyai kaedah untuk mengganggu tugas yang sedang berjalan dan menamatkan kumpulan benang.

ThreadPoolExecutor melaksanakan antara muka Executor dan ExecutorService dan memisahkan penciptaan tugas daripada pelaksanaan tugas. Kita perlu melaksanakan objek Runnable dan menghantarnya kepada pelaksana. ThreadPoolExecutorkemudiannya bertanggungjawab melaksanakan tugas, dan mencipta dan bekerja dengan benang .

Selepas tugas dihantar untuk pelaksanaan, benang sedia ada dalam kumpulan digunakan. Ini meningkatkan prestasi. Ia menyelesaikan masalah pembaziran sumber untuk mencipta dan memulakan utas baharu, dan sekali lagi pada pengumpulan sampah sebaik sahaja kami selesai dengan utas itu.

ThreadPoolExecutor mempunyai 4 pembina:


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)
    

Pembina ThreadPoolExecutor mempunyai parameter berikut:

terasPoolSize Parameter ini menunjukkan bilangan utas yang akan sedia (dimulakan) apabila perkhidmatan pelaksana bermula.
maksimumPoolSize Bilangan maksimum utas yang boleh dibuat oleh perkhidmatan pelaksana.
keepAliveTime Masa benang yang dibebaskan akan terus hidup sebelum dimusnahkan jika bilangan utas lebih daripadaterasPoolSize. Unit masa dinyatakan dalam parameter seterusnya.
unit Unit masa (jam, minit, saat, milisaat, dll.).
workQueue Pelaksanaan baris gilir untuk tugasan.
pengendali Pengendali untuk tugasan yang tidak dapat diselesaikan.
threadFactory Objek yang mencipta urutan baharu atas permintaan. Menggunakan kilang benang membuat panggilan ke perkakasan benang baharu secara bebas, membenarkan aplikasi menggunakan subkelas benang khas, keutamaan dan sebagainya.

Mencipta ThreadPoolExecutor

Kelas utiliti Executors boleh memudahkan penciptaan ThreadPoolExecutor . Kaedah kelas utiliti ini membantu kami menyediakan aThreadPoolExecutorobjek.

newFixedThreadPool — Mencipta kumpulan benang yang menggunakan semula bilangan benang tetap untuk melaksanakan sebarang bilangan tugas.

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool — Mencipta kumpulan benang di mana bilangan utas adalah sama dengan bilangan teras pemproses yang tersedia untuk JVM. Tahap konkurensi lalai ialah satu. Ini bermakna bahawa seberapa banyak benang akan dibuat dalam kumpulan kerana terdapat teras CPU yang tersedia untuk JVM. Jika tahap konkurensi ialah 4, maka nilai yang diluluskan digunakan dan bukannya bilangan teras.

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor — Mencipta kolam dengan satu utas untuk melaksanakan semua tugas.

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool — Mencipta kumpulan benang yang mencipta benang baharu seperti yang diperlukan, tetapi menggunakan semula benang yang dibuat sebelum ini apabila ia tersedia.

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool — Mencipta kumpulan benang yang boleh menjadualkan arahan untuk dilaksanakan selepas kelewatan yang diberikan atau secara berkala.

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

Kami akan mempertimbangkan setiap jenis kolam dalam pelajaran berikut.