Tôi đã đọc một blog thực sự tốt cách đây một thời gian để thảo luận về vấn đề này (được đề cập bởi Karl Bielefeldt), về cơ bản nó nói rằng nó rất nguy hiểm để thử và làm cho chuỗi bộ công cụ UI an toàn, vì nó đưa ra những bế tắc có thể xảy ra và tùy thuộc vào cách nó thực hiện, điều kiện cuộc đua vào khuôn khổ.
Ngoài ra còn có một xem xét hiệu suất. Bây giờ không nhiều lắm, nhưng khi Swing được phát hành lần đầu tiên, nó đã bị chỉ trích nặng nề vì hiệu suất của nó (rất tệ), nhưng đó không thực sự là lỗi của Swing, đó là sự thiếu hiểu biết của mọi người về cách sử dụng nó.
SWT thực thi khái niệm an toàn luồng bằng cách đưa ra các ngoại lệ nếu bạn vi phạm nó, không đẹp, nhưng ít nhất bạn đã nhận thức được về nó.
Nếu bạn nhìn vào quá trình vẽ tranh, ví dụ, thứ tự các yếu tố được vẽ là rất quan trọng. Bạn không muốn bức tranh của một thành phần có tác dụng phụ trên bất kỳ phần nào khác của màn hình. Hãy tưởng tượng nếu bạn có thể cập nhật thuộc tính văn bản của nhãn, nhưng nó được vẽ bởi hai luồng khác nhau, bạn có thể kết thúc bằng một đầu ra bị hỏng. Vì vậy, tất cả các bức tranh được thực hiện trong một chủ đề duy nhất, thông thường dựa trên thứ tự yêu cầu / yêu cầu (nhưng đôi khi cô đọng để giảm số lượng chu kỳ sơn vật lý thực tế)
Bạn đề cập đến việc thay đổi từ Swing sang JavaFX, nhưng bạn sẽ gặp vấn đề này với bất kỳ khung UI nào (không chỉ các máy khách dày, mà cả web), Swing dường như là vấn đề làm nổi bật vấn đề.
Bạn có thể thiết kế một lớp trung gian (bộ điều khiển của bộ điều khiển?) Có nhiệm vụ đảm bảo rằng các cuộc gọi đến UI được đồng bộ hóa chính xác. Không thể biết chính xác làm thế nào bạn có thể thiết kế các phần không phải UI của API theo quan điểm của API UI và hầu hết các nhà phát triển sẽ phàn nàn rằng mọi bảo vệ luồng được triển khai trong API UI là để hạn chế hoặc không đáp ứng nhu cầu của họ. Tốt hơn là cho phép bạn quyết định cách bạn muốn giải quyết vấn đề này, dựa trên nhu cầu của bạn
Một trong những vấn đề lớn nhất bạn cần xem xét là khả năng biện minh cho một thứ tự các sự kiện nhất định, dựa trên các đầu vào đã biết. Ví dụ: nếu người dùng thay đổi kích thước cửa sổ, mô hình Hàng đợi Sự kiện đảm bảo rằng một thứ tự các sự kiện đã cho sẽ xảy ra, điều này có vẻ đơn giản, nhưng nếu hàng đợi cho phép các sự kiện được kích hoạt bởi các luồng khác, thì bạn không còn có thể đảm bảo thứ tự trong mà các sự kiện có thể xảy ra (một điều kiện cuộc đua) và đột nhiên bạn phải bắt đầu lo lắng về các trạng thái khác nhau và không làm một điều gì cho đến khi có điều gì khác xảy ra và bạn bắt đầu phải chia sẻ cờ trạng thái xung quanh và bạn kết thúc với spaghetti.
Được rồi, bạn có thể giải quyết điều này bằng cách có một số loại hàng đợi đã đặt hàng các sự kiện dựa trên thời gian chúng được phát hành, nhưng đó không phải là những gì chúng ta đã có? Ngoài ra, bạn vẫn không thể đảm bảo rằng luồng B sẽ tạo ra các sự kiện SAU KHI A
Lý do chính khiến mọi người khó chịu về việc phải suy nghĩ về mã của họ, là vì họ được tạo ra để suy nghĩ về mã / thiết kế của họ. "Tại sao nó không thể đơn giản hơn?" Nó không thể đơn giản hơn, vì đó không phải là vấn đề đơn giản.
Tôi nhớ khi PS3 được phát hành và Sony đã nói về bộ xử lý Cell và khả năng thực hiện các dòng logic riêng biệt, giải mã âm thanh, video, tải và giải quyết dữ liệu mô hình. Một nhà phát triển trò chơi đã hỏi, "Điều đó thật tuyệt vời, nhưng làm thế nào để bạn đồng bộ hóa các luồng?"
Vấn đề mà nhà phát triển đã nói đến là, tại một số điểm, tất cả các luồng riêng biệt đó sẽ cần phải được đồng bộ hóa thành một ống dẫn cho đầu ra. Người dẫn chương trình nghèo chỉ nhún vai vì đó không phải là vấn đề mà họ quen thuộc. Rõ ràng, họ đã có giải pháp để giải quyết vấn đề này ngay bây giờ, nhưng nó thật buồn cười vào thời điểm đó.
Các máy tính hiện đại đang nhận rất nhiều đầu vào từ nhiều nơi khác nhau cùng một lúc, tất cả những đầu vào đó cần được xử lý và gửi đến người dùng mà không can thiệp vào việc trình bày thông tin khác, vì vậy đây là một vấn đề phức tạp. một giải pháp đơn giản.
Bây giờ, có khả năng chuyển đổi các khung công tác, đó không phải là một điều dễ dàng để thiết kế, NHƯNG, hãy sử dụng MVC trong giây lát, MVC có thể được nhiều lớp, nghĩa là bạn có thể có một MVC liên quan trực tiếp đến việc quản lý khung UI, bạn sau đó có thể bọc nó, một lần nữa, trong một lớp MVC cao hơn liên quan đến các tương tác với các khung công tác (có khả năng đa luồng) khác, lớp này sẽ có trách nhiệm xác định cách thức thông báo / cập nhật lớp MVC thấp hơn.
Sau đó, bạn sẽ sử dụng mã hóa để giao diện các mẫu thiết kế và các mẫu nhà máy hoặc nhà xây dựng để xây dựng các lớp khác nhau này. Điều này có nghĩa là, các khung công tác đa luồng của bạn trở nên tách rời khỏi lớp UI thông qua việc sử dụng lớp giữa, như một ý tưởng.