Mengenal Class Executors untuk Management Threading serta Implementasinya di Java

Ichwan Sholihin
3 min readOct 8, 2023

--

Photo by Sigmund on Unsplash

Halo semua, pada artikel kali ini saya akan membahas tentang pengenalan class Executors serta implementasinya di Java.

Di Java, kelas Executors adalah bagian dari paket java.util.concurrent yang menyediakan utility method untuk membuat dan mengelola eksekutor (executor) yang digunakan untuk mengelola eksekusi tugas (tasks) dalam aplikasi berbasis thread. Aplikasi berbasis thread sendiri adalah aplikasi yang menggunakan konsep multithreading, yaitu kemampuan sebuah sistem operasi atau program komputer untuk mengelola banyak tugas (atau “thread”) secara bersamaan atau asynchronous. Dalam konteks pengembangan perangkat lunak, “thread” merujuk pada unit terkecil dari eksekusi suatu program yang dapat dijadwalkan oleh program. Setiap thread memiliki urutan instruksi yang independen dan dapat dijalankan secara parallel dengan thread lain dalam aplikasi yang sama.

Pada artikel ini, kita bahas lebih dalam bagaimana cara mengelola thread dengan menggunakan kelas Executors. Kelas Executors menyediakan beberapa static method untuk membuat berbagai jenis eksekutor sesuai dengan kebutuhan aplikasi. Beberapa method yang paling umum digunakan termasuk newCachedThreadPool(), newFixedThreadPool(int nThreads), newSingleThreadExecutor(), dan newScheduledThreadPool(int corePoolSize).

Berikut adalah beberapa method utama yang disediakan oleh kelas Executors:

1) newCachedThreadPool()

Executors.newCachedThreadPool() adalah method untuk membuat eksekutor dengan jumlah thread yang dapat menyesuaikan diri secara dinamis sesuai dengan permintaan. Ketika ada tugas baru, eksekutor ini akan membuat thread baru jika belum mencapai batas maksimum, atau menggunakan thread yang ada yang sedang tidak digunakan. Tujuannya adalah untuk mengoptimalkan penggunaan sumber daya dengan membuat thread hanya jika diperlukan, dan mengelola thread yang tidak aktif.

Misalkan Anda mengembangkan aplikasi penyimpanan cloud yang memungkinkan pengguna mengunggah atau mengunduh file setiap saat. Dalam situasi ini, penggunaan newCachedThreadPool() memungkinkan server membuat thread sesuai dengan jumlah permintaan, memastikan penanganan tugas yang fluktuatif dengan efisien.

ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(new FileUploadTask(file));
executor.execute(new FileDownloadTask(file));

2) newFixedThreadPool(int nThreads)

Membuat executor dengan jumlah tetap thread sebanyak nThreads. Semua tugas akan dijalankan oleh thread-thread dalam pool ini.

Misalkan Anda mengembangkan aplikasi web server yang melayani permintaan dari klien. Dalam situasi ini, terdapat batasan pada jumlah thread yang dapat menangani permintaan HTTP untuk menghindari penggunaan memori yang berlebihan dan memastikan stabilitas sistem.

ExecutorService executor = Executors.newFixedThreadPool(20); // Maksimal 20 thread
executor.execute(new HttpRequestTask(request));

3) newSingleThreadExecutor()

Executors.newSingleThreadExecutor() adalah method untuk membuat eksekutor dengan hanya satu thread. Tujuannya adalah memastikan bahwa tugas-tugas dieksekusi satu per satu secara berurutan, tidak ada konkurensi, dan memastikan tugas dieksekusi secara terurut.

Dalam kasusnya, bayangkan Anda mengembangkan aplikasi obrolan realtime dengan antrian pesan. Dalam hal ini, pesan dari pengguna harus ditangani secara berurutan untuk menghindari kekacauan dalam pesan yang diterima atau dikirimkan.

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new MessageQueueTask(message));

4) newWorkStealingPool()

Membuat executor dengan jumlah thread setara dengan jumlah core CPU. Setiap thread memiliki antrian tugas sendiri dan dapat mencuri tugas dari antrian thread lain jika mereka telah menyelesaikan tugas mereka sendiri. Method ini diperkenalkan dalam Java 8.

Dalam kasusnya, ketika Anda mengembangkan aplikasi analisis data besar yang memerlukan pemrosesan data paralel. Work stealing pool memungkinkan aplikasi untuk mengoptimalkan penggunaan CPU pada semua core yang tersedia.

ExecutorService executor = Executors.newWorkStealingPool();
List<Callable<Result>> tasks = createIndependentTasks();
List<Future<Result>> results = executor.invokeAll(tasks);

5) newScheduledThreadPool(int corePoolSize)

Executors.newScheduledThreadPool(int corePoolSize) adalah method untuk membuat eksekutor yang mendukung penjadwalan tugas (scheduling tasks) dengan jumlah tetap thread. Tujuannya adalah untuk menjalankan tugas pada waktu tertentu, seperti menjalankan tugas secara teratur atau dengan penundaan tertentu.

ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
executor.schedule(new YourTask(), 5, TimeUnit.SECONDS);

Kelas Executors memudahkan penggunaan pola desain executor dalam pengembangan aplikasi Java yang melibatkan multithreading. Methodnya membantu pengembang untuk memilih jenis executor yang sesuai dengan kebutuhan aplikasi mereka, membantu mengoptimalkan kinerja, dan mengelola eksekusi tugas dengan lebih efisien.

--

--