Recipe 24.9 Background Saving in an Editor


Problem

You need to save the user's work periodically in an interactive program.

Solution

Use a background thread.

Discussion

This code fragment creates a new thread to handle background saves, as in most word processors:

public class AutoSave extends Thread {     /** The FileSave interface is implemented by the main class. */     protected FileSaver model;      /** How long to sleep between tries */     public static final int MINUTES = 5;     private static final int SECONDS = MINUTES * 60;     public AutoSave(FileSaver m) {         super("AutoSave Thread");         // setDaemon(true);        // so we don't keep the main app alive         model = m;     }     public void run( ) {         while (true) {        // entire run method runs forever.             try {                 sleep(SECONDS*1000);             } catch (InterruptedException e) {                 // do nothing with it             }             if (model.wantAutoSave( ) && model.hasUnsavedChanges( ))                 model.saveFile(null);         }     }

As you can see in the run( ) method, this code sleeps for five minutes (300 seconds), then checks whether it should do anything. If the user has turned autosave off, or hasn't made any changes since the last save, nothing needs to be done. Otherwise, we call the saveFile( ) method in the main program, which saves the data to the current file. It would be smarter to save it to a recovery file of some name, as the better word processors do.

What's not shown is that now the saveFile( ) method must be synchronized, and what's more, whatever method shuts down the main program must also be synchronized on the same object. It's easy to see why if you think about how the save method would work if the user clicked on the Save button at the same time that the autosave method called it, or if the user clicked on Exit while the file save method had just opened the file for writing. The "save to recovery file" strategy gets around some of this, but it still needs a great deal of care.



Java Cookbook
Java Cookbook, Second Edition
ISBN: 0596007019
EAN: 2147483647
Year: 2003
Pages: 409
Authors: Ian F Darwin

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net