Tasks sind Objekte im Sinne von Ada, d.h., man kann unterschiedliche Task-Typen definieren und beliebig viele Objekte dieses Typs anlegen. So ist es zum Beispiel möglich, Arrays von Tasks anzulegen, einen Task als Komponente eines Records zu haben oder Pointer auf Tasks zu definieren und später Tasks dynamisch (mit new) anzulegen.
Wie schon von den anderen, höheren Sprachmitteln Adas gewohnt, besteht ein Task aus einem Spezifikations- und einem Implementationsteil , dem Body . Bei der Spezifikation eines Tasks definiert man seine Entries. Das sind jene Bestandteile, die man von außerhalb des Tasks aufrufen kann. Sie können auch Parameter haben. Der Body des Tasks legt dann das Verhalten beim Aufruf so eines Entry's fest. Die Sprache definiert, daß immer nur genau ein Entry eines Tasks gleichzeitig aktiviert werden kann. Gleichzeitig eintreffende Aufrufe werden in einer Warteschlange gereiht.
Ein einfaches Beispiel für die Spezifikation eines Tastatur-Treibers ist folgendes:
task type Tastatur_Treiber is
Aufgrund der obigen Eigenschaften von Ada-Tasks ist durch die Spezifikation des Treibers als Task im Gegensatz zu einer Spezifikation als Paket gesichert, daß immer nur genau ein (anderer) Task Lese- und Schreiboperationen durchführen kann.
Falls nur ein Task gebraucht wird, kann das Schlüsselwort type nach task entfallen. Dann wird nur der Spezifikations- und Implementationsteil eines Tasks definiert, man kann jedoch keine weiteren Task-Objekte anlegen.