Complex concurrency in JavaFX: using ObservableLists and Properties from multiple worker threads

后端 未结 2 1283
醉酒成梦
醉酒成梦 2020-12-14 11:50

I have multiple worker threads, and a JavaFX GUI which is reporting on what is happening in these threads.

There is a lot of data shared between threads and it needs

2条回答
  •  时光取名叫无心
    2020-12-14 12:28

    Background Info

    Task javadoc includes numerous concurrency usage patterns for passing data between threads in JavaFX.

    Task includes convenience data transfer methods such as updateMessage and can be used instead of your Runnable with the user defined status property.

    When appropriate, consider using a collection structure designed for concurrency, such as a BlockingQueue. An additional advantage is that BlockingQueues can have size limits, which seems like something you want.

    Some general advice

    1. Be very careful when using mutable observable items in multiple threads. It is easy to inadvertently trigger updates that result in race conditions, updates to the active scene graph off the application thread and other threading issues.
    2. As much as possible, use immutable data rather than mutable observable items.
    3. Leverage some of the higher level utilities from the JavaFX concurrency and java.util.concurrent libraries.
    4. Avoid explicit synchronization and notify statements as much as possible.
    5. Be careful placing synchronization or other potentially blocking statements in code that runs on the JavaFX Application Thread - as you may make your GUI unresponsive.
    6. Use the JavaFX concurrency utilities only when you need interaction with the JavaFX thread.
    7. Do a lot of your very complicated multi-threaded processing off of the JavaFX thread using standard Java concurrency utilities. Have a single co-ordinating JavaFX Task for coalescing and controlling UI feedback.

    The above are just rules of thumb and don't need to be followed didactically.

    Reasonably Complex Threading Samples

    • A chart renderer that demonstrates some of the principles above to render 300 charts while still keeping the UI responsive to progress updates and user interaction.

提交回复
热议问题