using sleep() for a single thread
Solution 1:
Can anyone tell me why sleeping one thread is stopping my whole execution
to better explain your Swing GUI is created on its own special thread separate from that which main()
and other code will run in, this is done via creating your Swing components in the SwingUtilities.invokeXXX
block (even if you have not done this your GUI will be run on a single thread called the initial thread) . Now if you simply call sleep
while on Event Dispatch Thread
(or for that matter on the same Thread
) it will wait for the call to Thread.sleep
to finish. Now because all Swing events are processed on EDT we pause its execution by calling sleep(..)
thus pausing the UI events from being processed and therefore GUI is frozen (until sleep(..)
returns).
You should not use Thread.sleep(..)
on Event Dispatch Thread
(or any Thread
where sleep will cuase unwanted execution blocking), as this will cause the UI to seem frozen.
Here is a nice example which demonstrates exactly, this unwanted behavior caused by invoking Thread.sleep(..)
on GUI's EDT.
Rather use:
-
Swing Timer for example:
int delay=1000;// wait for second Timer timer = new Timer(delay, new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { //action that you want performed } }); //timer.setRepeats(false);//the timer should only go off once timer.start();
Swing Worker
or if no Swing components are being created/modified:
TimerTask
Thread, you would then use
Thread.sleep(int milis)
(but thats last option in any case IMO)
UPDATE
Swing Timer
/SwingWorker
was only added in Java 1.6, however, TimerTask
and Thread
have been around for alot longer sine Java 1.3 and JDK 1 repsectively, thus you could even use either of the 2 above methods and wrap calls that create/manipulate Swing components in SwingUtilities/EventQueue#invokeXX
block; thats the way things used to be done :P
Solution 2:
Thread.sleep
is a static method. Invocations of it via the reference of any given Thread
is simply a form of convenience.
As a result, any invocation of sleep
is really calling sleep
on the current Thread
, which I suspect is the Event Thread in your case. Sleeping/blocking on the Event Thread will give the appearance of being locked up.