One common strategy is to partition responsibility for multiple activities among separate threads – each of which acts autonomously – which are scheduled based upon priorities. For example, threads with tight timing constraints are given higher priorities than other threads.