The concurrency should not be limited to being either cooperative or preemptive.
It can also be:
▸ competitive — when the task should prove to the scheduler it deserves CPU ticks;
▸ disobliging — when the task is not started until another task has been finished and cleaned up the stack;
▸ obstinate — when the task does not pass the control until it’s done;
▸ sole — when the only task is allowed to participate in concurrent process.