Chapter 4. Thread Notification
In the previous chapter, we discussed data synchronization. Using synchronization and explicit locks, threads can interoperate and safely share data without any race conditions that might corrupt the state of the data. However, as we shall see, synchronization is more than avoiding race conditions: it includes a thread-based notification system that we examine in this chapter.
Thread notification addresses a number of issues in our sample application. Two of these relate to the random character generator and the animation canvas. The random character generator is created when the user presses the Start button; it is destroyed when the user presses the Stop button. Therefore, the listeners to the random character generator are reconnected each time the Start button is pressed. In fact, the entire initialization process is repeated every time that the Start button is pressed.
A similar problem exists for the animation component. Although the
component itself is not destroyed every time the user restarts, the thread
object that is used for the animation is discarded and recreated. The
component provides a mechanism that allows the developer to set the
done flag, but the component doesn’t
use that data to restart the animation: once the done flag is set to true, the run() method of the animation canvas exits. The
reason for this has to do with efficiency. The alternative is to loop
forever, waiting for the done flag to
be set to false. This consumes a lot ...