Προγραμματισμός εργασιών

Τα παραδείγματά μας μέχρι τώρα αφορούσαν την απλή δημιουργία, τον προγραμματισμό και την αναφορά προόδου μιας εργασίας. Ο μηχανισμός προγραμματισμού εργασιών είναι στην πραγματικότητα πιο ισχυρός απ'ότι έχουμε μέχρι τώρα δείξει. Μπορείτε να έχετε πιο ιδιαίτερο έλεγχο του τρόπου με τον οποίο προγραμματίζονται οι εργασίες σας, χρησιμοποιώντας προτεραιότητες, καθυστερήσεις και προσαρμοσμένες συνθήκες προγραμματισμού.

Προτεραιότητες εργασιών

Μπορείτε να χρησιμοποιήσετε μια προτεραιότητα εργασίας προκειμένου να υπογραμμίσετε τη σημασία μιας εργασίας η οποία σχετίζεται με άλλες εργασίες στο σύστημα. Ο ορισμός της προτεραιότητας μιας εργασίας δεν επηρεάζει μια εργασία η οποία εκτελείται εκείνη τη στιγμή, αλλά θα επηρεάσει τον τρόπο με τον οποίο μια εργασία σε αναμονή προγραμματίζεται σε σχέση με άλλες εργασίες. Η προτεραιότητα μιας εργασίας μπορεί να είναι μία από τις προκαθορισμένες σταθερές προτεραιοτήτων:

Η προεπιλεγμένη προτεραιότητα για μια εργασία είναι LONG. Το ακόλουθο τμήμα κώδικα δημιουργεί την κοινή εργασία που χρησιμοποιήσαμε νωρίτερα, αλλά ορίζει την προτεραιότητα στην σταθερά DECORATE για να δηλώσει ότι ανήκει στο χαμηλότερο επίπεδο προτεραιότητας:

   TrivialJob job = new TrivialJob();
   job.setPriority(Job.DECORATE);
   job.schedule();

Προγραμματισμός με καθυστέρηση

Μια άλλη τεχνική για τον έλεγχο του τρόπου προγραμματισμού μιας εργασίας είναι η χρήση μιας καθυστέρησης προγραμματισμού. Ο καθορισμός της καθυστέρησης προγραμματισμού είναι εφικτός κατά την πραγματοποίηση του προγραμματισμού. Η εργασία θα καθυστερήσει για όσα χιλιοστά του δευτερολέπτου καθορίζονται πριν από τον προγραμματισμό της.

   TrivialJob job = new TrivialJob();
   job.schedule(1000);  // wait one second before scheduling

Επαναπρογραμματισμός εργασιών

Ο προγραμματισμός μιας εργασίας η οποία ήδη βρίσκεται σε αναμονή ή αδράνεια δεν έχει κανένα αποτέλεσμα. Ωστόσο, ο προγραμματισμός μιας εργασίας η οποία ήδη εκτελείται θα προκαλέσει τον επαναπρογραμματισμό της μετά την ολοκλήρωσή της. Πρόκειται για έναν εύχρηστο μηχανισμό για επαναλαμβανόμενες εργασίες όπως οι βρόγχοι εξέτασης παρασκηνίου. Αν η εργασία, ενώ εκτελείται, επαναπρογραμματιστεί πολλές φορές, θα προγραμματιστεί πάλι μόνο μια φορά με την πιο πρόσφατα παρεχόμενη καθυστέρηση. Το ακόλουθο τμήμα κώδικα καθορίζει μια εργασία η οποία επαναπρογραμματίζεται η ίδια ώστε να εκτελείται 10 δευτερόλεπτα μετά την ολοκλήρωσή της τρέχουσας επανάληψης.

   class RepetitiveTrivialJob extends Job {
      public RepetitiveTrivialJob() {
         super("Repetitive Trivial Job");
      }
         public IStatus run(IProgressMonitor monitor) {
         System.out.println("Running the job.");
         // reschedule after 10 seconds
         schedule(10000);
            return Status.OK_STATUS;
      }
   }

Προσαρμοσμένες συνθήκες προγραμματισμού

Το πρόσθετο πρωτόκολλο στην κλάση Job επιτρέπει σε μια εργασία να ελέγχει για συνθήκες έναρξης πριν από τον προγραμματισμό ή την εκτέλεσή της. Η δυνατότητα αυτή μπορεί να περιγραφεί καλύτερα με ένα παράδειγμα:

class JobWithPreconditions extends Job {
	...
	public boolean shouldSchedule() {
		return super.shouldSchedule() && checkJobPreconditions();
	}
	public boolean shouldRun() {
		return super.shouldRun() && checkJobPreconditions();
	}
	...
}

Η μέθοδος shouldSchedule καλείται από τη λειτουργία διαχείρισης εργασιών, ακριβώς πριν από την τοποθέτηση της εργασίας στην ουρά. Δίνεται έτσι η δυνατότητα στην εργασία να ακυρώσει η ίδια τη λειτουργία της, εάν δεν πληρούνται οι βασικές συνθήκες έναρξης για τον προγραμματισμό. Αν η εργασία επιστρέψει false δεν συνιστάται να προχωρήσετε στον προγραμματισμό της. Ομοίως, η μέθοδος shouldRun καλείται ακριβώς πριν η λειτουργία διαχείρισης εργασιών εκτελέσει την εργασία. Τυχόν επρόσθετες συνθήκες οι οποίες πρέπει να πληρούνται πριν από την εκτέλεση της εργασίας θα πρέπει να ελέγχονται σε αυτό το στάδιο.