Swing Is Non Thread-Safe Inwards Coffee - What Does It Mean? Effect Dispatcher, Swingworker, Multithreading In Addition To Best Practices

Couple of my reader inquire question, what does it hateful past times Swing is non thread-safe in addition to How does it behavior upon coding inwards Swing GUI application? This postal service is an endeavour to assistance those readers in addition to several other programmers to empathize Swing in addition to thread-safety inwards a fighting to a greater extent than detailed way. To boot the bucket along it simple, let's revise what does it hateful past times beingness thread-safe? We say an object is thread-safe, if nosotros tin telephone outcry upward it's method, which tin alter it's state, from multiple thread at same time. To give yous an example, java.lang.String is a thread-safe class, which agency yous tin telephone outcry upward whatsoever method e.g. substring(), toUpperCase() or toLowerCase() from multiple threads. By the way, String is thread-safe because it's immutable. Let's come upward dorsum to Swing now, Core purpose of Swing is made upward of dissimilar GUI constituent e.g. JLable, JPanel, JCombobox etc. All these components are not thread-safe, which agency yous tin non telephone outcry upward methods of this components e.g. JLable.setText("new title") from whatsoever thread, other than Event Dispatcher Thread(EDT)

In i word, Since Swing is non thread-safe, yous tin non update Swing components from whatsoever random thread, they are ever updated using Event Dispatcher thread. This is inwards fact i of the most popular Java Swing Interview Question, amongst lot's of interesting follow-up e.g. 

If Swing is non thread-safe than how produce yous update components from other thread? in addition to which methods of Swing API are thread-safe? etc. We volition run across answer of this enquiry inwards adjacent section.



How to update Swing Component from dissimilar thread

blocking method in addition to blocks until GUI is updated, land invokeLater() is an asynchronous telephone outcry upward in addition to doesn't await for GUI to hold upward updated. By the way, both of these method brand certain that Swing GUI components are updated inwards EDT thread only. Both of these method takes a Runnable object, which contains code to update GUI, equally shown below :

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    JLable.setText("Update Title");
  }
}

to larn to a greater extent than virtually both of these methods in addition to How to exercise them, See when to exercise InvokeAndWait in addition to InvokeLater inwards Java.

Couple of times, Interviewer besides inquire about, how produce yous find, if a exceptional thread is Event Dispatcher thread or not? Well, if yous are familiar amongst Swing API, they yous may know that SwingUtilities provides isEventDispatchThread() method, which tin hold upward used to uncovering out if electrical flow thread is Event Dispatcher thread or not. Another follow-up enquiry is Why Swing is non thread-safe inwards Java? Well, this is on similar lines similar why multiple inheritance is non supported inwards Java or Why Java doesn’t back upward operator overloading

It's the determination taken past times at that topographic point designer, at that time. Since making an API thread-safe takes a lot of work, in addition to it's oft based upon produce goodness yous get. Since GUI screens are by in addition to large updated inwards response of user activity e.g. when user click a button, in addition to since events are handled inwards the same Event dispatcher thread, it's slowly to update GUI on that thread. It's rattling rare, when an update asking for GUI comes from a dissimilar thread e.g. may hold upward in i lawsuit a network asking is consummate or a file is loaded. 

In such cases, yous tin exercise either invokeAndWait(), invokeLater() or preferably SwingWorker class, which is designed to run these lengthy fourth dimension consuming business inwards a split thread in addition to same fourth dimension managing inter thread communication betwixt worker thread in addition to Event dispatcher thread. 

Since EDT thread is most of import inwards Swing in addition to responsible for listening number in addition to updating GUI, yous must non produce whatsoever fourth dimension consuming business on it, otherwise, yous jeopardy your application to boot the bucket unresponsive or frozen. Another telephone commutation affair to note, land using multi-threading inwards Swing evolution is that, non alone GUI components but at that topographic point model e.g. TableModel for JTable, must hold upward updated inwards Event Dispatcher thread. One of the crucial difference betwixt AWT in addition to Swing is that AWT components are thread-safe

Summary

Here is summary of our discussion, which is besides a listing of Java Swing best practices inwards multithreading environment. When yous exercise threads inwards Swing development, yous jeopardy of deadlock in addition to frozen GUI. By next these uncomplicated rules, yous minimize your chances of errors.

1) Since Swing components are non thread-safe, until whatsoever specifics mentioned inwards Javadoc, they must hold upward created in addition to modified from AWT Event Dispatcher thread.

2) Not alone Swing components but besides at that topographic point model e.g. ListModel, TableModel must hold upward modified from Event Dispatcher thread.

3) AWT Event Dispatcher thread is responsible for updating GUI in addition to listening events, then don't block them past times doing fourth dimension consuming business there.

4) You tin exercise java.awt.EventQueue's isDispatchThread() or SwingUtilities.isEventDispatchThread() to banking concern gibe if electrical flow thread is EDT.

5) Use SwingWorker to perform lengthy fourth dimension consuming business inwards worker thread.
6) Use InvokeAndWait() in addition to invokeLater() to update GUI components from threads other than Event Dispatcher thread.

That's all on Why Swing is non thread-safe inwards Java, to a greater extent than of import what does it hateful past times Swing beingness non thread-safe. We receive got besides touched base of operations on Event Dispatcher thread, SwingWorker, invokeAndWait, in addition to invokeLater. This is an extremely of import topic from Swing evolution in addition to Interview indicate of view. I receive got never seen a Java Swing Interview, without whatsoever enquiry from threading.

Further Reading
Java Swing (GUI) Programming: From Beginner to Expert
Mastering Java Swing - Part 1
The Complete Java MasterClass

0 Response to "Swing Is Non Thread-Safe Inwards Coffee - What Does It Mean? Effect Dispatcher, Swingworker, Multithreading In Addition To Best Practices"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel