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");
}