Egy BETA objektum alapja lehet egy végrehajtási szálnak. Ha ezt akarjuk, az objektumot speciális módon kell deklarálni:
Ezzel egy új objektum jön létre az Activity mintából, melyre az A változó egy statikus referencia lesz, ami párhuzamosan futhat a többi szállal. Egy szálat lehet futtatni konkurens folyamatként, vagy akár korutinként is. Például:
A szálat az A parancs segítségével lehet elindítani, ami elindítja a do részben levő programot. A futás ideiglenesen felfüggesztődik, mikor kiad egy suspend utasítást. Ezután egy újabb A parancs kiadásával onnan folytatódik a szál futása, ahol abbamaradt. Így ha B szintén egy példány az Activity mintából, akkor a következő parancs a két szál között váltogat:
Ezzel a módszerrel mint determinisztikus korutinokat futtathatjuk a szálakat. A hívó objektum vezérli az egyes korutinok végrehajtását.
Komponensek egyidejű végrehajtására a fork imperatív szolgál:
ahol S egy referencia. Az S.fork jelentése az, hogy az S végrehajtása az S-et végrehajtó komponens végrehajtásával egyidejűleg történik. Az S végrehajtása mindaddig folyamatban van, míg nem hív egy suspendet, vagy S futása be nem fejeződik. Ha S végrehajtásának felfüggesztését egy explicit suspend okozta, akkor folytatható egy újabb S.fork hívással.
Egyszerű szinkronizációt szemaforokkal valósíthatunk meg. A BETA nyelv rendelkezik beépített semaphore mintával. A semaphore-nak két művelete van: P és V. Használata:
Az alábbi példa bankszámlák kezelésén keresztül mutatja be a szemafor használatát. Az egyenleghez (balance) a betét (Deposit) és a kivét (Withdraw) csak egymást kizárva férhetnek hozzá.
A bonyolultabb szinkronizációk segítésére a BETA-ban definiálták a monitor mintát.
A monitor mintának egy szemafor attribútuma és egy Entry lokális eljárása van, melyek közül minden pillanatban legfeljebb csak egy futhat. A Monitor mintának a wait kiterjesztése arra szolgál, hogy az eljárásokban meg tudjuk várni bizonyos feltételek teljesülését:
Az alábbi példa a termelő-fogyasztó feladat egy lehetséges megvalósítása. A termelő a billentyűzetről olvas be karaktereket egy bufferbe, a fogyasztó pedig a bufferből kivett karaktereket írja ki a képernyőre.
Összetett rendszernek nevezzük a több részből álló többeseményes rendszereket. Összetett rendszerek létrehozására a System minta conc attribútuma szolgál. A párhuzamosan futtatandó mintáknak a System mintát kell kiterjeszteniük, majd ezeket a "start" függvény meghívásával kell aktiválni. Például:
Ekkor S meghívásával az Si objektumok do utáni része párhuzamosan kezd futni, és csak akkor lép tovább, ha az összes Si befejezte a futását.
A BETA könyvtár nyújt támogatást az Ada-ban használt szinkronizált randevúk megvalósítására is. A következő példa egy italautomata szimulációját végzi el. Az automata kávét és levest tud adni, a vevő az automatát a "make_coffee" vagy "make_soup" műveleteivel indíthatja el. Ha a "make_coffee" eljárást hívták meg, akkor a "get_coffee" művelettel lehet elkérni a kész kávét, a levest pedig a "get_soup" művelettel. A "System" mintának van egy "port" nevű mintája, amivel a szinkronizációt meg lehet valósítani. A "port" minta definiál egy "entry" nevű műveletet. A "port" típusú objektum "entry" műveletének felülírásával lehet kapcsolatba hozni egy "port"-ot és egy műveletet.
Az automata programja:
Az "activate.accept" utasítás addig várakozik, amíg egy másik szál nem hívja meg az "activate" port-tal kapcsolatba hozott valamelyik műveletet. Kezdetben az automata elfogadja a "make_coffee" és a "make_soup" hívásokat, de ennek a végrehajtása után már csak a megfelelő "get_..." művelet hajtódhat végre, a nem megengedett műveleteket hívó szálaknak várakozniuk kell. A megfelelő "get_..." művelet lefutása után az automata ismét elfogadja a "make_..." műveleteket. Az automatát a következő módon lehet használni:
A BETÁ-ban tehát a "System", "port", "entry" minták lehetővé teszik az Ada-ban megszokott task-szinkronizációt igénylő feladatok megoldását.
A fejezet elején láttunk példát arra, hogyan lehet folyamatokat alternálva végrehajtani. Az ott bemutatott módszer determinisztikus, ám a BETÁ-nak van eszköze arra, hogy ezt nemdeterminisztikusan tegyük: a System minta alt attribútuma. Példa:
Azok a komponensek, amelyek éppen nem futnak, a végrehajtási folyamatuk egy jól definiált pontján várakoznak. Ezek azok a pontok, ahol a végrehajtás átadódik valamelyik másik komponensnek. Ezek a pontok a következők lehetnek:
A kommunikáció itt azt jelenti, hogy egy komponens egy másik komponens egy entry eljárását vagy egy acceptet akar végrehajtani.
Példa konkurenciára, monitorra és szemaforra: Billentyűzetbuffer