Java - Penjadual Thread

Halo di sana, ahli penyihir Java masa depan! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia penjadualan thread Java. Jangan khawatir jika anda baru dalam pemrograman – saya akan menjadi pemandu yang bersahabat untuk anda, dan kita akan membahas topik ini langkah demi langkah. Jadi, rakitkan wands virtual anda (papan kekunci), dan mari kita melompat!

Java - Thread Scheduler

Apa itu Penjadual Thread?

Sebelum kita melompat ke rincian, mari kita fahami apa itu penjadualan thread. Bayangkan jika anda adalah ringmaster cirque (itu adalah runtime Java), dan anda memiliki beberapa pelaku yang menunggu untuk menampilkan pertunjukan mereka. Tugas anda adalah untuk memutuskan yang mana pelaku yang akan naik rakit dan untuk berapa lama. Itulah yang sebenarnya penjadualan thread lakukan di Java – menguruskan beberapa thread dan memutuskan yang mana yang akan dijalankan dan kapan.

Mengapa Kita Perlu Penjadual Thread?

Anda mungkin bertanya-tanya, "Mengapa kita tidak membiarkan semua thread berjalan kapanpun mereka mau?" Walau bagaimanapun, bayangkan jika semua pelaku cirque mencoba untuk melakukan pertunjukan pada saat yang sama – itu akan menjadi kacau! Penjadualan thread membantu menjaga ketenangan, memastikan alokasi sumber yang adil, dan meningkatkan performa sistem secara keseluruhan.

Penjadual Thread Java

Java memiliki penjadual thread bawaan yang menangani tugas kompleks ini untuk kita. Ini menggunakan kombinasi dari penjadualan di level sistem operasi dan algoritma sendiri untuk menguruskan thread secara efisien.

Status Thread

Sebelum kita melompat ke penjadualan, mari kita ikuti beberapa status yang sebuah thread boleh berada di dalam:

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

Penjadual bertanggung jawab untuk memindahkan thread antara beberapa status ini.

Pembuatan dan Penjadualan Thread Dasar

Mari kita mulai dengan contoh sederhana untuk melihat bagaimana Java membuat dan menjadualkan 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 hingga 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 penjadual Java yang memutuskan kapan untuk beralih antara thread!

Prioritas Thread

Java membolehkan kita untuk memberikan petunjuk kepada penjadual tentang thread mana yang lebih penting. Kita dapat mengatur prioritas thread menggunakan metode setPriority(). Mari kita ubah 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("Low Priority Thread: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("High Priority Thread: " + 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 untuk memiliki prioritas terendah dan thread2 untuk memiliki prioritas tertinggi. Walaupun ini tidak menjamin bahwa thread2 akan selalu dijalankan lebih dulu atau lebih sering, itu memberikan penjadual petunjuk bahwa harus memilih thread2 jika mungkin.

ScheduledExecutorService

Sekarang, mari kita lihat cara yang lebih maju untuk menjadualkan thread menggunakan ScheduledExecutorService. Alat ini yang kuat membolehkan kita untuk menjadualkan tugas untuk dijalankan setelah penundaan 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("Task 1 executed at: " + System.currentTimeMillis());
Runnable task2 = () -> System.out.println("Task 2 executed at: " + 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 dijadualkan untuk dijalankan sekali setelah penundaan 5 detik.
  • task2 dijadualkan untuk dijalankan setiap 2 detik, dimulai segera.
  • Kita membiarkan program berjalan selama 10 detik sebelum mematikan executor.

Ini menunjukkan bagaimana kita dapat mengontrol dengan presisi kapan dan berapa sering tugas kita akan dijalankan.

Method ScheduledExecutorService

Berikut adalah tabel dari method utama yang disediakan oleh ScheduledExecutorService:

Method Keterangan
schedule(Runnable, long, TimeUnit) Menjadualkan tugas sekali untuk dijalankan setelah penundaan tertentu
scheduleAtFixedRate(Runnable, long, long, TimeUnit) Menjadualkan tugas untuk dijalankan secara periodik, dengan penundaan tetap antara permulaan setiap eksekusi
scheduleWithFixedDelay(Runnable, long, long, TimeUnit) Menjadualkan tugas untuk dijalankan secara periodik, dengan penundaan tetap antara akhir eksekusi satu dan permulaan yang berikutnya

Kesimpulan

Dan itu adalah, rakyat! Kita telah melakukan perjalanan melalui dasar-dasar penjadualan thread Java, dari pembuatan thread sederhana ke penjadualan tingkat lanjut dengan ScheduledExecutorService. Ingat, penjadualan 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 tingkah laku thread. Tetapi untuk saat ini, pattediri anda – anda telah mengambil langkah besar ke dunia pemrograman konkuaten!

Terus latihan, tetap curious, dan yang paling penting, bersenang-senanglah saat coding! Siapa tahu, mungkin suatu hari anda akan menulis generasi berikutnya penjadual thread Java. Sampai saat itu, happy threading!

Credits: Image by storyset