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!
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:
- Baru
- Dapat dijalankan
- Berjalan
- Diblokir/Menunggu
- 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