Ταυτοχρονισμός και χώρος εργασίας

Είδαμε ήδη ότι ο κώδικας χώρου εργασίας πρέπει να ενημερώνεται για τον ταυτοχρονισμό ακόμα και εάν δεν χρησιμοποιεί το πλαίσιο ταυτοχρονισμού. Η ομαδοποίηση των αλλαγών στο χώρο εργασίας και η χρήση των κανόνων προγραμματισμού βοηθά την κοινή χρήση του χώρου εργασίας με άλλες πρόσθετες λειτουργίες (και τα νήματά τους) που τροποποιούν το χώρο εργασίας. Από τη στιγμή που η πρόσθετη λειτουργία σας, χρησιμοποιεί ομαδοποίηση και κανόνες (δείτε την ενότητα Ομαδοποίηση αλλαγών πόρου), είναι εύκολο να εκτελέσετε την ίδια εργασία με χρήση των μηχανισμών ταυτοχρονισμού πλατφόρμας.

Έργα χώρου εργασίας

Ένα Έργο είναι η βασική μονάδα ασύγχρονης εργασίας που εκτελείται ταυτοχρονισμένα με άλλες εργασίες. Η πρόσθετη λειτουργία πόρων ορίζει την κλάση WorkspaceJob ως ένα εύχρηστο μηχανισμό για τον καθορισμό των ασύγχρονων τροποποιήσεων πόρου. Ο κώδικας που θα έπρεπε κανονικά να ομαδοποιείται στο IWorkspaceRunnable τοποθετείται αντ' αυτού στη μέθοδο runInWorkspace στο δευτερεύον είδος έργου ενός χώρου εργασίας. Αντί ο κώδικας να εκτελείται με χρήση του πρωτοκόλλου IWorkspace, το έργο προγραμματίζεται ακριβώς όπως και οποιοδήποτε άλλο έργο. Οι κατάλληλοι κανόνες προγραμματισμού πρέπει να προστίθενται στο έργο πριν από τον προγραμματισμό του.

Ας ρίξουμε μια ματιά στο παράδειγμα ενός εκτελέσιμου χώρου εργασίας και στις ενέργειες που απαιτούνται για να το μετατρέψουμε σε ένα έργο:

IWorkspaceRunnable myRunnable = 
	new IWorkspaceRunnable() {
		public void run(IProgressMonitor monitor) throws CoreException {
			//do the actual work in here
			doSomeWork();
			...
		}
}

Η εργασία μετακινείται στην κατάλληλη μέθοδο του δευτερεύοντος είδους της κλάσης WorkspaceJob.

class MyWorkspaceJob extends WorkspaceJob {
	public MyWorkspaceJob() {
		super("My Workspace Job");
	}
	public IStatus runInWorkspace(IProgressMonitor monitor) {
		//do the actual work in here
		doSomeWork();
		return Status.OK_STATUS;
	}
}

Χρειάστηκε ειδικά να γίνει κλήση ενός εκτελέσιμου:

   IWorkspace workspace = ResourcesPlugin.getWorkspace();
workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);

Το έργο μας έχει προγραμματιστεί όπως και ένα οποιοδήποτε άλλο έργο. Η λειτουργία διαχείρισης εργασίας πλατφόρμας θα το εκτελέσει με βάση την προτεραιότητά της, τις άλλες εργασίες στην ουρά και τους κανόνες προγραμματισμού. Σημειώστε ότι πρέπει να συνδέσουμε τον κανόνα προγραμματισμού με το έργο προκειμένου να αποφύγουμε την ταυτόχρονη τροποποίηση του myProject.

MyWorkspaceJob job = new MyWorkspaceJob();
job.setRule(myProject);
   job.schedule();

Η λειτουργία τώρα έχει δομηθεί ως εργασία, και μπορείτε να χρησιμοποιήσετε τους μηχανισμούς προγραμματισμού (προτεραιότητα, καθυστέρηση, επαναπρογραμματισμός) στο σύνολό τους. Τα συμβάντα αλλαγής πόρου θα ομαδοποιούνται μέχρι να ολοκληρωθεί η εκτέλεση της εργασίας.