- User melakukan action pada Swing GUI komponen misalnya button
- Action yang dieksekusi ditulis dalam method event listeners
- Event listeners selalu dieksekusi dalam Event Dispatch Thread
- Event Dispatch Thread bertanggung jawab untuk mengeksekusi semua event satu persatu.
- Jika ada event yang prosesnya lama, event selanjutnya tidak akan dieksekusi sebelum proses tersebut selesai. Event yang belum dieksekusi akan menunggu di Event Queue.
- Jika event yang belum dieksekusi adalah event yang mengubah tampilan GUI, maka GUI akan terlihat hang dan tidak responsif (frezee).
- Komponen Swing memang tidak didesain secara default thread save, jadi implementasi yang salah bisa membuat aplikasi Swing
Solusi asynchronous (misalnya,
SwingWorker 3) melakukan proses berikut:
- Segera keluar dari listener method dengan mendelegasikan proses ke thread baru
- Dengan bantuan class SwingWorker, thread baru yang mengerjakan task/event yang prosesnya lama
- Menggunakan method SwingUtilities.invokeLater() untuk mengirimkan event baru ke Event Queue
- Setelah worker thread menyelesaikan prosesnya, maka worker mengirimkan method finished() ke Event Queue
Solusi synchronous (misalnya,
Spin dan
Foxtrot) melakukan proses berikut:
- Menggunakan worker thread
- Event Dispatch Thread tidak keluar dari listener method, tapi melakukan dequeue events
- Setelah time-consuming task selesai worker class memerintahkan Event Dispatch Thread untuk memberhentikan proses dequeue events dari Event QUeue
- Kelebihan dengan solusi ini :Kode program lebih readable dan sederhana, exception handling yang lebih baik
No comments:
Post a Comment