Az Emerald a párhuzamosságot, konkurenciát az aktív objektumokkal támogatja. Egy aktív objektum tartalmaz egy processzust, mely az objektum inicializálása után indul és az objektum operációinak hívásával párhuzamosan hajtódik végre. A következő példa az étkező filozófusok problémájában szereplő filozófus objektumot valósítja meg.
const aPhilosopher <-
object P
process
loop
Table.pickupForks [p]
Node.sleep [eatingTime]
Table.putdownForks [p]
Node.sleep [thinkingTime]
end loop
end process
end P
Egy Emerald processzus egy független szálat reprezentál. Új szálakat dinamikusan lehet
létrehozni egyszerűen új objektumok létrehozásával. A következő példában öt filozófus objektum jön létre.
const anOrganizer <-
object Organizer
process
var count : Integer <- 5
const philoArray ¬ Array.of[Philosopher].create[5]
loop
philoArray[count] <-
object P
%lásd fent
end P
count <- count – 1
exit when count = 0
end loop
end process
end Organizer
Mivel az objektumok, melyek a
philoArray elemeit alkotják nem exportálnak operációkat, objektum-konstruktort használunk, hogy a unixbeli fork utasításhoz hasonló hatást érjünk el.
Az Emeraldban az operációk hívása szinkronizált. Ez azt jelenti, hogy lehet több szimultán hívása ugyanannak az objektum operációnak. Sok nyelvben minden objektumnak van egy üzenetsora a bejövő kéréseknek és a szálak egy halmaza válaszol a kérésekre. Az Emerald
monitort használ, hogy szabályozza a hozzáférést egy objektum állapotához, a szinkronizációt pedig a rendszer által definiált
kondíció objektumok segítségével oldja meg. Az Emerald monitor hasonló a Konkurens Pascal és a Konkurens Euclid monitorához, de teljesen egy objektumba zártan valósul meg. Egy objektum processzusa a monitoron kívül kezdődik, de be tud lépni a monitorba a monitor operációinak meghívásával, ha megosztott állapotba szeretne kerülni.