🎯 📘 Bagian 2 (Lanjutan & Penerapan) • Modul 14 100% Standar Industri & Vokasi

Concurrency & Multi-Threading dengan Isolates

Modul pembelajaran Concurrency & Multi-Threading dengan Isolates.

⚡ Pemrograman DART

16. Concurrency & Multi-Threading dengan Isolates

1. Mengapa Dart Menggunakan Isolates?

Di bahasa seperti Java atau C++, multi-threading berbagi memori yang sama (Shared Memory) yang sering memicu *Race Condition* dan *Deadlock*. Dart mengatasi masalah ini dengan Isolates: setiap isolate memiliki memori dan thread CPU sendiri yang terisolasi sepenuhnya. Tidak ada data yang dibagikan; semua komunikasi dilakukan via pengiriman pesan (Message Passing).

┌─────────────────────────────────────────────────────────────┐ │ ARSITEKTUR DART ISOLATES │ └──────────────────────────────┬──────────────────────────────┘ │ ┌───────────────────────┴───────────────────────┐ ▼ ▼ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │ MAIN ISOLATE │ │ BACKGROUND ISOLATE │ │ UI Rendering & Event Loop │ ◄─────► │ Komputasi Berat & Parsing │ │ (Memori Heap Mandiri #1) │ Port │ (Memori Heap Mandiri #2) │ └─────────────────────────────┘ └─────────────────────────────┘

2. Menjalankan Komputasi Berat dengan Isolate.run()

Metode modern Isolate.run() menjalankan fungsi berat di thread terpisah tanpa memblokir animasi UI utama:

import 'dart:isolate';

// Fungsi komputasi berat (misal: enkripsi atau kalkulasi ribuan data)
int hitungFibonacci(int n) {
  if (n <= 1) return n;
  return hitungFibonacci(n - 1) + hitungFibonacci(n - 2);
}

void main() async {
  print("Memulai komputasi latar belakang...");

  // Menjalankan di Isolate terpisah
  int hasil = await Isolate.run(() => hitungFibonacci(40));

  print("Hasil Fibonacci(40): $hasil");
  print("UI tetap responsif dan lancar!");
}

3. Komunikasi Dua Arah via ReceivePort & SendPort

import 'dart:isolate';

void pekerjaLatar(SendPort kirimKeUtama) {
  // Membuat port penerima di isolate pekerja
  var portPekerja = ReceivePort();
  kirimKeUtama.send(portPekerja.sendPort);

  portPekerja.listen((pesan) {
    print("[PEKERJA] Menerima tugas: $pesan");
    kirimKeUtama.send("SELESAI: $pesan telah diproses.");
  });
}

void main() async {
  var portUtama = ReceivePort();
  await Isolate.spawn(pekerjaLatar, portUtama.sendPort);

  // Menunggu port dari pekerja
  var portPekerja = await portUtama.first as SendPort;
  portPekerja.send("Kompresi Gambar 4K");
}