Wednesday, March 16, 2005

Java: Multi threading pada aplikasi JFC/Swing

  • 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:

Followers