<Swing Dev> How to resolve image tearing

ximalaya ims3g at 126.com
Tue May 31 13:10:20 UTC 2011


Thank you all, good conclusion to JDK users, :)

At 2011-05-28 01:40:28,"Anthony Petrov" <anthony.petrov at oracle.com> wrote:

>On 5/27/2011 7:33 PM, tom.hawtin at oracle.com wrote:
>> On 27/05/2011 15:37, Walter Laan wrote:
>>>> We didn't change JComponent.repaint() to make it "no longer thread
>>> safe"
>>>> and I don't see why someone may think about it
>>>
>>> The bug report https://netbeans.org/bugzilla/show_bug.cgi?id=192548
>>> shows the stack:
>>> -
>>> With the latest changes to jdk7 and jdk6 update 22 it's no longer true
>>> due to
>>> repaint()'s call to getLocationOnScreen() which acquires AWT tree lock:
>> 
>> Whilst not ideal, it doesn't seem unreasonable that repaint should 
>> acquire a lock (that's usually how thread-safety is done).
>> 
>> The stack trace in that bug doesn't appear to show a deadlock as such. 
>> What it does show is Netbean waiting on one of its own locks on the AWT 
>> EDT.
>> 
>> "AWT-EventQueue-0" prio=6 tid=0x04713c00 nid=0x7d8 in Object.wait() 
>> [0x0599e000]
>> 
>>    java.lang.Thread.State: WAITING (on object monitor)
>>         at java.lang.Object.wait(Native Method)
>>         - waiting on <0x1c24efb0> (a 
>> org.netbeans.lib.editor.util.PriorityMutex)
>
>Thanks Tom. That's a nice find.
>
>I'm not sure if this is documented somewhere (if not, it should be), but 
>while being multi-threaded, AWT doesn't tolerate blocking of the EDT 
>under any circumstances. It's a general understanding/agreement that 
>events must be processed as fast as possible. Moreover, this is 
>especially relevant to Swing since most of Swing operations should take 
>place on the EDT *only*, and as such keeping the thread unblocked is 
>vital for Swing to operate correctly. The library even provides the 
>SwingWorker utility class that helps process long operations while 
>allowing the EDT to handle other events.
>
>The only allowed case when the EDT can be blocked is displaying a modal 
>(J)Dialog by means of calling its setVisible(true) from an event 
>handler. In this case AWT/Swing are responsible for keeping the wheel 
>rolling. In all other cases a blocked EDT may cause problems that 
>AWT/Swing simply can't resolve.
>
>So, if the deadlock (or whatever it is) is caused by blocking the EDT, 
>this suggests that it is NetBeans that's causing the problem, not JDK.
>
>--
>best regards,
>Anthony
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20110531/b65be680/attachment.html>


More information about the swing-dev mailing list