We’ll conclude our examples with an examination of job scheduling. Unlike round-robin scheduling, job scheduling is not related to thread starvation prevention or fairness. The concept of job scheduling is more closely related to when a runnable object is executed than to how a runnable object is run.
There are many applications of job scheduling. We could have a word
processor application that needs to save work every five minutes to
prevent data loss. We could have a backup program that needs to do an
incremental backup every day; this same program may also need to do a
full backup once a week. In our Animate applet (see Chapter 2), we needed to generate a repaint request
every second. At the time, we accomplished that by having the timer
thread schedule itself by calling the
method repeatedly. In that example, the scheduling of the repaint
request was simple to implement, and we only had this single repeated
job to schedule.
For more complex scheduling of jobs, or for programs that have countless jobs that need to be scheduled, having a dedicated job scheduler may be easier than implementing the scheduling of every job in the program. Furthermore, in the case of the timer thread, we needed to create a thread just to handle the job. If many jobs are required, a job scheduler may be preferred over having many threads that schedule themselves. This dedicated job scheduler can run all the jobs in its own thread, or it can assign the jobs to a thread pool ...