ThreadPoolExecutor - 1

"Pemrogram biasa cepat atau lambat menyadari fakta bahwa mereka memiliki banyak tugas kecil yang perlu dilakukan dari waktu ke waktu."

"Jika Anda menulis sebuah game, maka itu adalah tindakan yang dilakukan masing-masing karakter."

"Jika Anda menulis server web, maka perintah yang berbeda datang dari pengguna: unggah foto, transkode ke dalam format yang diinginkan, terapkan template yang diinginkan, dll."

"Cepat atau lambat, semua tugas besar dipecah menjadi serangkaian tugas kecil yang dapat dikelola."

"Jadi, mengingat konteks ini, muncul pertanyaan halus: bagaimana Anda mengatur semuanya? Bagaimana jika Anda perlu melakukan beberapa ratus tugas dalam satu menit? Membuat utas untuk setiap tugas tidak masuk akal. Mesin Java mengalokasikan cukup banyak sumber daya untuk setiap utas."

"Dengan kata lain, membuat dan menghancurkan utas mungkin membutuhkan lebih banyak waktu dan sumber daya daripada tugas itu sendiri."

"Pembuat Java datang dengan solusi elegan untuk masalah ini: ThreadPoolExecutor .

" ThreadPoolExecutor adalah kelas dengan dua hal di dalamnya:"

A)  Antrian tugas, yang dapat Anda tambahkan tugas saat muncul dalam program.

B) Kumpulan utas, yang merupakan grup utas yang melakukan tugas ini.

"Terlebih lagi, utas tidak dihancurkan setelah tugas selesai. Sebaliknya, mereka tertidur untuk siap memulai tugas baru segera setelah muncul."

"Saat Anda membuat ThreadPoolExecutor , Anda dapat mengatur jumlah maksimum utas yang akan dibuat dan jumlah maksimum tugas yang dapat diantrekan. Dengan kata lain, Anda dapat membatasi jumlah utas hingga 10, misalnya, dan jumlah antrean tugas hingga 100."

"Beginilah cara kerja ThreadPoolExecutor :"

1)  Saat Anda menambahkan tugas baru, tugas itu ditempatkan di akhir antrean.

2)  Jika antrian penuh, pengecualian dilemparkan.

3)  Setelah menyelesaikan tugas, setiap utas mengambil tugas berikutnya dari antrean dan mulai menjalankannya.

4) Jika tidak ada tugas dalam antrean, utas akan tidur hingga tugas baru ditambahkan.

"Pendekatan, di mana kami membatasi jumlah utas pekerja, menguntungkan karena semakin banyak utas yang kami miliki, semakin mereka mengganggu satu sama lain. Jauh lebih efektif untuk memiliki 5-10 utas pekerja dan antrean tugas yang panjang daripada untuk membuat 100 utas untuk lonjakan tugas, yang akan bersaing satu sama lain untuk sumber daya: memori, waktu prosesor, akses basis data, dll."

"Inilah contoh ThreadPoolExecutor yang sedang beraksi:"

Contoh
ExecutorService service = Executors.newFixedThreadPool(2);

for(int i = 0; i < 10; i++)
{
 service.submit(new Runnable() {
    public void run()
    {
     // Here we download something big from the Internet.
    }
 });
}

"Eh, aku tidak melihatnya ..."

" Objek ThreadPoolExecutor dibuat saat metode newFixedThreadPool dipanggil."

Jadi, sangat mudah digunakan. Segera setelah Anda menambahkan tugas ke dalamnya dengan metode kirim, itu:

A)  Membangunkan utas yang sedang tidur, jika ada, untuk menjalankan tugas.

B)  Jika tidak ada utas menunggu, maka akan dibuat utas baru untuk tugas tersebut.

C)  Jika jumlah utas maksimum tercapai, maka itu hanya menempatkan tugas di akhir antrian.

"Saya sengaja memasukkan «di sini kami mengunduh sesuatu yang besar dari Internet» dalam contoh. Jika kami memiliki 100 tugas «mengunduh sesuatu yang besar dari Internet», maka tidak masuk akal untuk menjalankan banyak tugas sekaligus—kami' akan tertahan oleh batas bandwidth koneksi Internet kita. Dalam hal ini, beberapa utas sudah cukup. Inilah yang Anda lihat pada contoh di atas:"

ExecutorService service = Executors.newFixedThreadPool(2);

"Ternyata bekerja dengan banyak tugas tidak begitu sulit."

"Ya. Bahkan lebih mudah dari yang kau bayangkan. Tapi Kim akan memberitahumu tentang itu."