Java - Penjadwal Thread

Halo semua, para penyihir Java masa depan! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia penjadwalan thread Java. Jangan khawatir jika Anda masih baru di bidang pemrograman – saya akan menjadi pemandu yang ramah, dan kita akan membahas topik ini langkah demi langkah. Jadi, siapkan wands virtual Anda (papan tombol), dan mari kita melompat!

Java - Thread Scheduler

Apa itu Penjadwalan Thread?

Sebelum kita melompat ke hal yang kacau, mari kita mengerti apa itu penjadwalan thread. Bayangkan Anda adalah ringmaster di cirque (itu adalah runtime Java), dan Anda memiliki beberapa penari (thread) yang menunggu untuk menampilkan pertunjukan mereka. Tugas Anda adalah untuk memutuskan siapa penari yang akan naik panggung dan berapa lama. Itulah esensi dari penjadwalan thread di Java – mengelola beberapa thread dan memutuskan yang mana yang akan berjalan dan kapan.

Mengapa Kita Memerlukan Penjadwalan Thread?

Anda mungkin bertanya-tanya, "Mengapa kita tidak membiarkan semua thread berjalan kapan saja?" Walau, bayangkan jika semua penari di cirque mencoba untuk berprestasi sekaligus – itu akan menjadi kekacauan! Penjadwalan thread membantu menjaga ketenangan, memastikan alokasi sumber daya yang adil, dan meningkatkan performa sistem secara keseluruhan.

Penjadwal Thread Java

Java memiliki penjadwal thread bawaan yang menangani tugas kompleks ini untuk kita. Ini menggunakan kombinasi dari penjadwalan di level sistem operasi dan algoritme sendiri untuk mengelola thread secara efisien.

Status Thread

Sebelum kita melompat ke penjadwalan, mari kita singkat mengulas status yang dapat ditempuh oleh sebuah thread:

  1. Baru
  2. Dapat Berjalan
  3. Berjalan
  4. Diblokir/Menunggu
  5. Selesai

Penjadwal bertanggung jawab untuk memindahkan thread antara status ini.

Pembuatan dan Penjadwalan Thread Dasar

Mari kita mulai dengan contoh sederhana untuk melihat bagaimana Java membuat dan menjadwalkan thread:

public class SimpleThreadExample {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 1: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 2: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

thread1.start();
thread2.start();
}
}

Dalam contoh ini, kita membuat dua thread yang mencetak angka dari 0 sampai 4. Panggilan Thread.sleep(1000) membuat setiap thread berhenti selama 1 detik antara setiap cetak.

Ketika Anda menjalankan program ini, Anda akan melihat bahwa output mungkin tidak dalam urutan bergantian yang sempurna. Itu karena penjadwal Java yang memutuskan kapan untuk beralih antara thread!

Prioritas Thread

Java memungkinkan kita untuk memberikan petunjuk kepada penjadwal tentang thread mana yang lebih penting. Kita dapat mengatur prioritas thread menggunakan metode setPriority(). Mari kita modifikasi contoh sebelumnya:

public class ThreadPriorityExample {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread Prioritas Rendah: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread Prioritas Tinggi: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

thread1.setPriority(Thread.MIN_PRIORITY);
thread2.setPriority(Thread.MAX_PRIORITY);

thread1.start();
thread2.start();
}
}

Dalam contoh ini, kita mengatur thread1 memiliki prioritas terendah dan thread2 memiliki prioritas tertinggi. Walaupun ini tidak menjamin bahwa thread2 akan selalu berjalan lebih dulu atau lebih sering, itu memberikan penjadwal petunjuk bahwa seharusnya memilih thread2 jika mungkin.

ScheduledExecutorService

Sekarang, mari kita lihat cara yang lebih tingkat untuk menjadwalkan thread menggunakan ScheduledExecutorService. Alat yang kuat ini memungkinkan kita untuk menjadwalkan tugas untuk dijalankan setelah jeda atau pada interval tetap.

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorExample {
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);

Runnable task1 = () -> System.out.println("Tugas 1 dieksekusi pada: " + System.currentTimeMillis());
Runnable task2 = () -> System.out.println("Tugas 2 dieksekusi pada: " + System.currentTimeMillis());

executor.schedule(task1, 5, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(task2, 0, 2, TimeUnit.SECONDS);

try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}

executor.shutdown();
}
}

Dalam contoh ini:

  • Kita membuat ScheduledExecutorService dengan 2 thread.
  • task1 dijadwalkan untuk dieksekusi sekali setelah jeda 5 detik.
  • task2 dijadwalkan untuk dieksekusi setiap 2 detik, dimulai segera.
  • Kita membiarkan program berjalan selama 10 detik sebelum mematikan executor.

Ini menunjukkan bagaimana kita dapat mengontrol secara presisi kapan dan berapa sering tugas kita harus berjalan.

Metode ScheduledExecutorService

Berikut adalah tabel dari metode utama yang disediakan oleh ScheduledExecutorService:

Metode Deskripsi
schedule(Runnable, long, TimeUnit) Menjadwalkan tugas sekali untuk dijalankan setelah jeda yang ditentukan
scheduleAtFixedRate(Runnable, long, long, TimeUnit) Menjadwalkan tugas untuk dijalankan secara periodik, dengan jeda tetap antara permulaan setiap eksekusi
scheduleWithFixedDelay(Runnable, long, long, TimeUnit) Menjadwalkan tugas untuk dijalankan secara periodik, dengan jeda tetap antara akhir eksekusi satu dan permulaan yang berikutnya

Kesimpulan

Dan itu semua, teman-teman! Kita telah melakukan perjalanan melalui dasar-dasar penjadwalan thread Java, dari pembuatan thread sederhana ke penjadwalan tingkat lanjut dengan ScheduledExecutorService. Ingat, penjadwalan thread adalah seperti mengatur orkestra – itu semua tentang harmoni dan waktu.

Sebagai Anda melanjutkan petualangan Java Anda, Anda akan menemukan lebih banyak cara untuk menajamkan perilaku thread. Tetapi untuk saat ini, pujilah diri Anda – Anda telah mengambil langkah besar ke dunia pemrograman konkurran!

Terus latihan, tetap curious, dan yang paling penting, nikmati pemrograman! Siapa tahu, mungkin suatu hari Anda akan menulis generasi berikutnya dari penjadwal thread Java. Sampai saat itu, happy threading!

Credits: Image by storyset