• Post Reply Bookmark Topic Watch Topic
  • New Topic

Why does animation need threads????  RSS feed

Dee Reavis
Posts: 8
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
This is modified animation code from the code barn. I have essentially just removed the thread. If you execute this code it will just show the final position of the rectangle, but none of the intermediate positions. Why can't I see the animation this way(on the main thread)? What does an additional thread add?
import java.awt.* ;
import java.applet.Applet ;
public class HelloAnimThreadFirst extends Applet // implements Runnable

private int imageHeight , imageWidth ; //size of animating rectangle
private int currX , currY ; // left,top corner of rectangle

public void init()
imageHeight = 25 ;
imageWidth = 40 ;
// set up starting position
currX = 30 ;
currY = 30 ;
// create and start the thread
// Thread animator = new Thread( this );
// animator.start();
} //close init

public void run()
// update location of the rectangle 40 times, and call repaint each time
for ( int i = 0 ; i <= 80 ; i++ )
{for(int j = 0;j<10000000;j++){}
// update the x and y coordinates for the rectangle
currX = currX + 3 ;
currY = currY + 3 ;
// now call repaint which will ultimately lead to paint being called
} //close for loop
} //close run

public void paint( Graphics g )
g.drawRect( currX , currY , imageWidth , imageHeight );
} // close paint
} // close class

Rahul Rathore
Ranch Hand
Posts: 324
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
In your single-thread version, the reason why the applet shows only the final position of the rectangle is that - the first ever call to the paint() of applet is only AFTER init() returns. But when init() returns, the run() method has completed execution- so when the first call is made to paint() only the final position of the rectangle is retained.
Note that repaint() calls in the run() do not directly call the paint() method- rather these calls simply schedule calls to paint()-and the first call to paint will only be after init() has returned.
We may rectify by making the call to run() in the start() method rather than the init() method. Again no separate thread is created. But we have no control over animation which will execute completely once start() is called. And if start() is executing, how will other methods like stop() execute ?
In the original code example we start a separate thread in init()- then thread executing init() will immediately return and then applet paint() is called. The repaint calls in the concurrently executing animation thread will therefore take effect.
It is probably clear by now why we want a separate thread. The reason is that we may want to control the animation. For eg. we may use the start() and stop() method for starting/resuming animation and the stop() method for suspending animation.

[This message has been edited by Rahul Rathore (edited March 07, 2001).]
Consider Paul's rocket mass heater.
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
Boost this thread!