Konkurencia és munkaterület

Már láttuk, hogy a munkaterületkódnak tudnia kell kezelni a konkurenciát akkor is, ha nem használja a konkurencia-keretrendszert. A munkaterület-módosítások kötegelése és az ütemezési szabályok használata lehetővé teszi a munkaterület megosztását más bedolgozókkal (és ezek szálaival), amelyek módosítják a munkaterületet. Ha a bedolgozó kötegelési szabályt használ (lásd Erőforrásmódosítások kötegelése), akkor egyszerű végrehajtani ugyanazt a feladatot a platform konkurencia mechanizmusok segítségével.

Munkaterület feladatok

A feladat az aszinkron munka alapegysége, amely más feladatokkal egyidejűleg fut. Az erőforrások bedolgozó meghatározza a WorkspaceJob elemet az aszinkron erőforrásmódosítások megadásának mechanizmusaként. A kód, amely normál esetben egy IWorkspaceRunnable elemben kerülne kötegelésre, a munkaterület feladat-altípus egy runInWorkspace metódusába kerül be. A kód IWorkspace protokollal futtatása helyett a feladat ugyanúgy kerül ütemezésre, mint a többi feladat. A megfelelő ütemezési szabályokat ütemezés előtt hozzá kell adni a feladathoz.

Tekintse meg a példa munkaterület futtatható fájlt, és hogy mit kell tenni, hogy feladat legyen belőle:

IWorkspaceRunnable myRunnable = 
	new IWorkspaceRunnable() {
		public void run(IProgressMonitor monitor) throws CoreException {
			//a tényleges munka itt történik
			doSomeWork();
			...
		}
}

A feladat átkerült a WorkspaceJob altípus megfelelő metódusába.

class MyWorkspaceJob extends WorkspaceJob {
	public MyWorkspaceJob() {
		super("My Workspace Job");
	}
	public IStatus runInWorkspace(IProgressMonitor monitor) {
			//a tényleges munka itt történik
		doSomeWork();
		return Status.OK_STATUS;
	}
}

A futtatható fájlokat speciálisan meg kell hívni:

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

A feladat a többi feladathoz hasonlóan van ütemezve. A platform feladatkezelő a prioritásnak, a sor egyéb feladatainak, és az ütemezési szabályoknak megfelelően fogja futtatni. Ne feledje el, hogy az ütemezési szabályt a feladathoz kell csatolni a myProject egyidejű módosítása érdekében.

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

Most, hogy a művelet már feladatként van strukturálva, az összes ütemezési mechanizmus (prioritás, késleltetés, újbóli ütemezés) használható. Az erőforrásmódosítási események kötegelve lesznek, amíg a feladat be nem fejezi a futást.