Saya membaca blog yang sangat bagus beberapa waktu lalu yang membahas masalah ini (disebutkan oleh Karl Bielefeldt), yang pada dasarnya dikatakan adalah bahwa sangat berbahaya untuk mencoba dan membuat utas kit UI aman, karena memperkenalkan kebuntuan yang mungkin terjadi dan tergantung pada bagaimana hal itu terjadi. Diimplementasikan, perlombaan kondisi ke dalam kerangka kerja.
Ada juga pertimbangan kinerja. Tidak begitu banyak sekarang, tetapi ketika Swing pertama kali dirilis itu sangat dikritik karena kinerjanya (buruk), tapi itu tidak benar-benar kesalahan Swing, itu adalah kurangnya pengetahuan orang-orang tentang bagaimana menggunakannya.
SWT memberlakukan konsep keselamatan ulir dengan melemparkan pengecualian jika Anda melanggarnya, tidak cantik, tapi setidaknya Anda dibuat menyadarinya.
Jika Anda melihat proses melukis, misalnya, urutan unsur-unsur yang dilukis sangat penting. Anda tidak ingin lukisan satu komponen memiliki efek samping pada bagian lain dari layar. Bayangkan jika Anda dapat memperbarui properti teks label, tetapi itu dilukis oleh dua utas yang berbeda, Anda bisa berakhir dengan output yang rusak. Jadi semua lukisan dikerjakan dalam satu utas, biasanya berdasarkan urutan persyaratan / permintaan (tapi terkadang terkondensasi untuk mengurangi jumlah siklus cat fisik yang sebenarnya)
Anda menyebutkan perubahan dari Swing ke JavaFX, tetapi Anda akan memiliki masalah ini dengan hampir semua kerangka UI (bukan hanya klien yang tebal, tetapi juga web), Swing sepertinya menjadi satu-satunya yang menyoroti masalah tersebut.
Anda bisa mendesain lapisan menengah (pengontrol dari controller?) Yang tugasnya adalah memastikan bahwa panggilan ke UI disinkronkan dengan benar. Tidak mungkin untuk mengetahui dengan tepat bagaimana Anda dapat merancang bagian non-UI API Anda dari perspektif API UI dan sebagian besar pengembang akan mengeluh bahwa perlindungan utas apa pun yang diterapkan ke dalam API UI adalah untuk membatasi atau tidak memenuhi kebutuhan mereka. Lebih baik memungkinkan Anda untuk memutuskan bagaimana Anda ingin menyelesaikan masalah ini, berdasarkan kebutuhan Anda
Salah satu masalah terbesar yang perlu Anda pertimbangkan adalah kemampuan untuk membenarkan urutan peristiwa tertentu, berdasarkan masukan yang diketahui. Misalnya, jika pengguna mengubah ukuran jendela, model Antrian Acara menjamin bahwa urutan peristiwa tertentu akan terjadi, ini mungkin tampak sederhana, tetapi jika antrian memungkinkan acara dipicu oleh utas lain, maka Anda tidak lagi dapat menjamin pesanan dalam di mana peristiwa mungkin terjadi (kondisi balapan) dan tiba-tiba Anda harus mulai mengkhawatirkan keadaan yang berbeda dan tidak melakukan satu hal sampai sesuatu yang lain terjadi dan Anda mulai harus berbagi bendera negara di sekitar dan Anda berakhir dengan spageti.
Oke, Anda bisa menyelesaikan ini dengan memiliki semacam antrian yang memesan acara berdasarkan waktu mereka dikeluarkan, tetapi bukankah itu yang sudah kita miliki? Selain itu, Anda masih tidak dapat menjamin bahwa utas B akan menghasilkan acara itu SETELAH utas A
Alasan utama orang marah karena harus memikirkan kode mereka, adalah karena mereka dibuat untuk berpikir tentang kode / desain mereka. "Kenapa tidak bisa lebih sederhana?" Itu tidak bisa lebih sederhana, karena itu bukan masalah yang sederhana.
Saya ingat ketika PS3 dirilis dan Sony berbicara tentang prosesor Cell dan kemampuannya untuk melakukan jalur logika yang terpisah, mendekode audio, video, memuat dan menyelesaikan data model. Salah satu pengembang game bertanya, "Itu semua luar biasa, tetapi bagaimana Anda menyinkronkan streaming?"
Masalah yang dibicarakan pengembang adalah, pada titik tertentu, semua aliran terpisah perlu disinkronkan ke satu pipa untuk keluaran. Presenter yang malang itu hanya mengangkat bahu karena itu bukan masalah yang mereka kenal. Jelas, mereka memiliki solusi untuk menyelesaikan masalah ini sekarang, tetapi itu lucu pada saat itu.
Komputer modern mengambil banyak input dari banyak tempat berbeda secara bersamaan, semua input itu perlu diproses dan dikirim ke pengguna secara langsung yang tidak mengganggu penyajian informasi lain, jadi ini adalah masalah yang kompleks, tanpa solusi tunggal yang sederhana.
Sekarang, memiliki kemampuan untuk beralih kerangka kerja, itu bukan hal yang mudah untuk dirancang untuk, TETAPI, ambil MVC sejenak, MVC dapat berlapis-lapis, yaitu, Anda dapat memiliki MVC yang berhubungan langsung dengan mengelola kerangka kerja UI, Anda kemudian dapat membungkusnya, sekali lagi, dalam lapisan MVC yang lebih tinggi yang berhubungan dengan interaksi dengan kerangka kerja lain (berpotensi multi-ulir), akan menjadi tanggung jawab lapisan ini untuk menentukan bagaimana lapisan MVC yang lebih rendah diberitahukan / diperbarui.
Anda kemudian akan menggunakan pengkodean untuk pola desain antarmuka dan pola pabrik atau pembangun untuk membangun lapisan yang berbeda ini. Ini berarti, bahwa Anda kerangka kerja multithreaded menjadi dipisahkan dari lapisan UI melalui penggunaan lapisan tengah, sebagai ide.