Java - Komunikasi Antar-Thread

Selamat datang, pemrogram Java yang aspiratif! Hari ini, kita akan menyusuri perjalanan yang menarik ke dunia komunikasi antar-thread di Java. Sebagai guru sains komputer yang ramah di lingkungan anda, saya di sini untuk menjunjungkan anda melalui topik yang menarik ini. Jadi, rakam minuman kesukaan anda, Duduk dengan santai, dan mari kita melompat masuk!

Java - Inter-thread Communication

Apa itu Komunikasi Antar-Thread?

Bayangkan anda berada di atas rakit penyelenggaraan. Anda harus melempar rakit kepada rakit penyambung anda pada saat yang tepat. Itu hampir sama dengan apa yang komunikasi antar-thread tentang di dunia pemrograman. Itu adalah bagaimana thread yang berbeda dalam program Java berbicara satu sama lain, mengkoordinasi tindakan mereka, dan berbagi informasi.

Mengapa Komunikasi Antar-Thread Penting?

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

Metode yang Digunakan untuk Komunikasi Antar-Thread

Java menyediakan beberapa metode untuk komunikasi antar-thread. Mari kita lihat mereka dalam tabel yang mudah dipakai:

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

Sekarang, mari kita pecahkan ini dan lihat bagaimana mereka bekerja di tindakan!

Metode wait()

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

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

Dalam kode ini:

  1. Kita pertama-tama sinkronkan pada objek untuk memastikan keselamatan thread.
  2. Kita memeriksa kondisi dalam sebuah loop while.
  3. Jika kondisi adalah benar, kita memanggil wait(), yang membuat thread berhenti dan menunggu notifikasi.

Metode notify()

Metode notify() seperti mengetuk thread yang sedang menunggu di atas bahu dan mengatakan, "Bangun! Sekarang giliran kamu." Ini bagaimana kita menggunakannya:

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

Dalam kode ini:

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

Metode notifyAll()

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

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

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

Contoh Dunia Nyata: Masalah Pembuat-Pengguna

Mari kita gabungkan semua ini dengan contoh klasik: Masalah Pembuat-Pengguna. Bayangkan sebuah pabrik roti di mana satu orang (pembuat) membuat roti, dan yang lain (pengguna) menjualnya. Mereka berbagi ruang rakit terbatas.

Ini bagaimana kita dapat mengimplementasikannya di Java:

class Bakery {
private int breads = 0;
private final int CAPACITY = 5;

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

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

class Baker implements Runnable {
private Bakery bakery;

public Baker(Bakery bakery) {
this.bakery = bakery;
}

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

class Seller implements Runnable {
private Bakery bakery;

public Seller(Bakery bakery) {
this.bakery = bakery;
}

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

public class BakeryDemo {
public static void main(String[] args) {
Bakery bakery = new Bakery();
Thread baker = new Thread(new Baker(bakery));
Thread seller = new Thread(new Seller(bakery));

baker.start();
seller.start();
}
}

Mari kita pecahkan ini:

  1. Kita memiliki kelas Bakery yang mengelola persediaan roti.
  2. Metode produceBread() mewakili pembuat membuat roti. Jika rakit penuh, pembuat menunggu.
  3. Metode sellBread() mewakili penjual menjual roti. Jika tidak ada roti, penjual menunggu.
  4. Kita menggunakan wait() saat kondisi tidak baik untuk membuat atau menjual.
  5. Kita menggunakan notify() setelah membuat atau menjual untuk memperingatkan thread lain.
  6. Kelas Baker dan Seller berjalan di atas thread yang berbeda, secara terus menerus mencoba untuk membuat 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 untuk anda, teman-teman! Kita telah menyusuri wilayah komunikasi antar-thread di Java. Kita telah melihat bagaimana thread dapat mengkoordinasi tindakan mereka menggunakan wait(), notify(), dan notifyAll(). Kita bahkan telah membangun pabrik roti virtual untuk melihat konsep ini di tindakan!

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

Terus latihan, tetap curious, dan senang coding! Dan ingat, dalam pemrograman serta dalam kehidupan, komunikasi yang baik adalah kunci kesuksesan. Sampai jumpa lagi, ini adalah guru sains komputer yang ramah di lingkungan anda, menandatangani off!

Credits: Image by storyset