Multithreading Java Dijelaskan: Konsep, Siklus Hidup, dan Contoh Kode Praktis
Aplikasi Java seringkali perlu melakukan beberapa tugas secara bersamaan. Tutorial ini memandu Anda melalui eksekusi single-threaded versus multi-threaded, siklus hidup thread, teknik sinkronisasi, dan contoh kode praktis yang mengilustrasikan setiap konsep.
Apa Itu Single Thread?
Satu thread di Java adalah unit eksekusi terkecil. Runtime Java membuat user thread saat aplikasi dimulai, dan Anda dapat menambahkan thread user atau daemon threads tambahan sesuai kebutuhan. Daemon thread berjalan di latar belakang dan tidak mencegah JVM untuk keluar.
Contoh single thread:
package demotest; public class GuruThread { public static void main(String[] args) { System.out.println("Single Thread"); } }
Keuntungan eksekusi single-threaded:
Overhead minimal—hanya satu konteks eksekusi yang dipertahankan.
Debugging dan pemeliharaan yang lebih sederhana.
Apa Itu Multithreading di Java?
Multithreading memungkinkan dua atau lebih thread untuk berjalan secara bersamaan, memaksimalkan penggunaan CPU. Thread berbagi ruang memori yang sama, jadi switch konteks cepat dan penggunaan memori tetap rendah.
Contoh pembuatan dua thread bersamaan:
package demotest; public class GuruThread1 implements Runnable { public static void main(String[] args) { Thread guruThread1 = new Thread("Guru1"); Thread guruThread2 = new Thread("Guru2"); guruThread1.start(); guruThread2.start(); System.out.println("Nama thread adalah berikut:"); System.out.println(guruThread1.getName()); System.out.println(guruThread2.getName()); } @Override public void run() { // logika thread di sini } }
Manfaat multithreading:
UI yang tidak pemblokir dan pemrosesan latar belakang.
Ketangguhan—exception dalam satu thread tidak menghentikan thread lain.
Siklus Hidup Thread di Java
Siklus hidup thread terdiri dari lima state yang berbeda:
New – Thread diinstantiasi tetapi belum dimulai.
Runnable – Thread telah dimulai dan siap untuk dieksekusi.
Running – Thread sedang dieksekusi secara aktif.
Waiting – Thread ditangguhkan sampai peristiwa tertentu terjadi.
Dead – Thread telah menyelesaikan eksekusi.
Siklus Hidup Thread di Java
Metode Thread Utama
Metode
Deskripsi
start()
Memulai eksekusi thread; JVM memanggil run().
sleep(long milliseconds)
Menunda thread saat ini untuk durasi yang ditentukan.
getName()
Mengembalikan nama thread.
setPriority(int newPriority)
Menyesuaikan prioritas thread (1–10).
yield()
Menyarankan jadwal untuk menunda thread saat ini.
Contoh Thread Praktis
Berikut adalah contoh ringkas yang mendemonstrasikan pembuatan thread, penyesuaian prioritas, dan tidur.
package demotest; public class ThreadExample1 implements Runnable { @Override public void run() { // kerja thread di sini } public static void main(String[] args) { Thread guruThread1 = new Thread(); guruThread1.start(); try { Thread.sleep(1000); // jeda selama 1 detik } catch (InterruptedException e) { e.printStackTrace(); } guruThread1.setPriority(1); System.out.println(guruThread1.getPriority()); System.out.println("Thread Berjalan"); } }
Contoh keluaran:
Sinkronisasi Thread
Ketika banyak thread mengakses sumber daya bersama, sinkronisasi memastikan konsistensi data. Di Java, Anda dapat membungkus bagian kritis dengan kata kunci synchronized, yang menjamin akses eksklusif.
synchronized(object) { // blok sinkronisasi }
Contoh Multithreading Lanjutan
Berikut adalah contoh yang lebih rumit yang membuat dua thread, masing-masing mencetak namanya dan counter dengan penundaan satu detik.
package demotest; public class GuruThread2 { public static void main(String[] args) { GuruThread3 threadGuru1 = new GuruThread3("guru1"); threadGuru1.start(); GuruThread3 threadGuru2 = new GuruThread3("guru2"); threadGuru2.start(); } } class GuruThread3 implements Runnable { private Thread guruthread; private String guruname; GuruThread3(String name) { this.guruname = name; } @Override public void run() { System.out.println("Thread berjalan " + guruname); for (int i = 0; i < 4; i++) { System.out.println(i); System.out.println(guruname); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Thread telah diinterupsi"); } } } public void start() { System.out.println("Thread dimulai"); if (guruthread == null) { guruthread = new Thread(this, guruname); guruthread.start(); } } }
Keluaran biasa (diilustrasikan dalam gambar yang menyertai):
Kesimpulan
Multithreading membebaskan aplikasi dari panggilan yang pemblokir dan memungkinkan operasi bersamaan.
Siklus hidup thread—New, Runnable, Running, Waiting, Dead—menentukan state yang dilalui thread.
Sinkronisasi esensial saat thread berbagi data, mencegah race conditions.
Contoh kode praktis memperkuat pemahaman tentang pembuatan thread, manajemen siklus hidup, dan sinkronisasi.