Java - Komunikasi Antar-Tread

Selamat datang, para pemrogram Java yang aspiratif! Hari ini, kita akan memulai perjalanan yang menarik ke dunia komunikasi antar-tread di Java. Sebagai guru ilmu komputer tetangga yang ramah, saya di sini untuk menjelaskan topik yang menarik ini. Jadi,ambil minuman favorit anda, rasakan dirumah saja, dan mari kita melompat masuk!

Java - Inter-thread Communication

Apa itu Komunikasi Antar-Tread?

Bayangkan Anda berada di lomba estafet. Anda harus melempar rakit ke rekan tim Anda pada waktu yang tepat. Itulah esensi dari komunikasi antar-tread di dunia pemrograman. Itu adalah cara thread yang berbeda dalam program Java berbicara satu sama lain, mengkoordinasi tindakan mereka, dan berbagi informasi.

Mengapa Komunikasi Antar-Tread Penting?

Komunikasi antar-tread sangat penting untuk membuat program yang efisien dan sinkron. Tanpa itu, thread kita akan seperti pelari dalam lomba yang berbeda, tidak dapat bekerja sama atau membagi sumber daya secara efektif.

Metode yang Digunakan untuk Komunikasi Antar-Tread

Java menyediakan beberapa metode untuk komunikasi antar-tread. Mari kita lihat di atas tabel yang praktis:

Metode Deskripsi
wait() Mengakibatkan thread saat ini menunggu sampai thread lain memanggil metode notify() atau notifyAll() untuk objek ini
notify() Mengbangunkan satu thread yang sedang menunggu di atas monitor objek ini
notifyAll() Mengbangunkan semua thread yang sedang menunggu di atas monitor objek ini

Sekarang, mari kita pecahkan ini dan lihat bagaimana cara kerjanya!

Metode wait()

Metode wait() seperti mengatakan kepada sebuah thread, "Hei, istirahat dulu sampai seseorang memberikan teguran." Ini cara kerjanya:

synchronized(object) {
while(kondisi) {
object.wait();
}
}

Dalam kode ini:

  1. Kita terlebih dahulu sinkronkan dengan objek untuk memastikan keamanan thread.
  2. Kita memeriksa kondisi di atas loop while.
  3. Jika kondisi benar, kita memanggil wait(), yang membuat thread berhenti dan menunggu notifikasi.

Metode notify()

Metode notify() seperti mengetuk thread yang menunggu di atas bahu dan mengatakan, "Bangun! Giliranmu sekarang." Ini cara kita menggunakannya:

synchronized(object) {
// Mengubah kondisi
kondisi = true;
object.notify();
}

Dalam kode ini:

  1. Kita sinkronkan dengan objek yang sama seperti pemanggilan wait().
  2. Kita mengubah kondisi yang thread yang menunggu sedang memeriksa.
  3. Kita memanggil notify() untuk mengbangunkan satu thread yang menunggu.

Metode notifyAll()

Metode notifyAll() seperti untuk mengumumkan, "Semua orang bangun!" Itu digunakan saat Anda ingin memberi tahu semua thread yang menunggu. Ini contohnya:

synchronized(object) {
// Mengubah kondisi
kondisi = true;
object.notifyAll();
}

Ini bekerja sama seperti notify(), tetapi mengbangunkan semua thread yang menunggu bukannya hanya satu.

Contoh Dunia Nyata: Masalah Produsen-Konsumen

Mari kita gabungkan semua ini dengan contoh klasik: Masalah Produsen-Konsumen. Bayangkan sebuah pabrik roti di mana satu orang (produsen) membuat roti, dan yang lain (konsumen) menjualnya. Mereka memiliki rak penyimpanan terbatas.

Ini cara kita dapat mengimplementasikannya di Java:

class PabrikRoti {
private int roti = 0;
private final int KAPASITAS = 5;

public synchronized void produksiRoti() throws InterruptedException {
while (roti == KAPASITAS) {
System.out.println(" Rak penuh! Pembuat roti menunggu...");
wait();
}
roti++;
System.out.println("Pembuat roti membuat roti. Total: " + roti);
notify();
}

public synchronized void jualRoti() throws InterruptedException {
while (roti == 0) {
System.out.println("Tidak ada roti! Penjual menunggu...");
wait();
}
roti--;
System.out.println("Menjual roti. Sisa: " + roti);
notify();
}
}

class PembuatRoti implements Runnable {
private PabrikRoti pabrikRoti;

public PembuatRoti(PabrikRoti pabrikRoti) {
this.pabrikRoti = pabrikRoti;
}

public void run() {
for (int i = 0; i < 10; i++) {
try {
pabrikRoti.produksiRoti();
Thread.sleep(1000); // Waktu untuk memanggang
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class Penjual implements Runnable {
private PabrikRoti pabrikRoti;

public Penjual(PabrikRoti pabrikRoti) {
this.pabrikRoti = pabrikRoti;
}

public void run() {
for (int i = 0; i < 10; i++) {
try {
pabrikRoti.jualRoti();
Thread.sleep(1500); // Waktu antara penjualan
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public class DemoPabrikRoti {
public static void main(String[] args) {
PabrikRoti pabrikRoti = new PabrikRoti();
Thread pembuatRoti = new Thread(new PembuatRoti(pabrikRoti));
Thread penjual = new Thread(new Penjual(pabrikRoti));

pembuatRoti.start();
penjual.start();
}
}

Mari kita pecahkan ini:

  1. Kita memiliki kelas PabrikRoti yang mengelola inventori roti.
  2. Metode produksiRoti() mewakili pembuat roti membuat roti. Jika rak penuh, pembuat roti menunggu.
  3. Metode jualRoti() mewakili penjual menjual roti. Jika tidak ada roti, penjual menunggu.
  4. Kita menggunakan wait() saat kondisi tidak memungkinkan untuk memproduksi atau menjual.
  5. Kita menggunakan notify() setelah memproduksi atau menjual untuk memberi tahu thread lain.
  6. Kelas PembuatRoti dan Penjual berjalan di atas thread terpisah, secara terus-menerus mencoba untuk memproduksi atau menjual roti.

Saat Anda menjalankan program ini, Anda akan melihat pembuat dan penjual bekerja sama, menunggu saat diperlukan, dan memberi tahu satu sama lain saat mereka dapat melanjutkan. Itu seperti menonton tarian yang terkoordinasi dengan baik!

Kesimpulan

Dan itu tadi, teman-teman! Kita telah melakukan perjalanan melalui wilayah komunikasi antar-tread di Java. Kita telah melihat bagaimana thread dapat mengkoordinasi tindakan mereka menggunakan wait(), notify(), dan notifyAll(). Kita bahkan telah membuat pabrik roti virtual untuk melihat konsep ini dalam aksi!

Ingat, seperti dalam contoh pabrik roti kita, komunikasi antar-tread yang baik adalah tentang keseimbangan dan koordinasi. Itu tentang mengetahui kapan untuk bekerja, kapan untuk menunggu, dan kapan untuk memberi tahu orang lain. Master ini, dan Anda akan berada di jalan untuk membuat program Java yang efisien dan terkoordinasi.

Terus latihan, tetap curious, dan happy coding! Dan ingat, dalam pemrograman serta dalam kehidupan, komunikasi yang baik adalah kunci keberhasilan. Sampai jumpa lagi, ini adalah guru ilmu komputer tetangga Anda yang ramah, menandatangani keluar!

Credits: Image by storyset