1. A method for scheduling a first software thread for execution on a hardware system comprising at least a first processor group and a second processor group, wherein each of the processor groups comprises at least two strands each capable of executing the first software thread, and wherein the first processor group has access to a first hardware component and the second processor group has access to a second hardware component, the first and second hardware components each offering a first functionality via their processor groups' respective strands, the method comprising: for the first software thread, determining a first software resource demand including a count of strands that needs to be unused and available in a processor group to execute the first software thread; for the first software thread, determining a first functionality hardware resource demand including an amount of usage needed of the first functionality, wherein the determining occurs while the first software thread is operational in the hardware system without isolating the first software thread from an optional second software thread that is operational on the hardware system along with the first software thread and the determining uses usage information provided by the hardware system; for the first software thread, after the first software thread has run at least a minimum number of times, determining a thread resource demand vector including an entry for the first software resource demand and an entry for the first functionality hardware resource demand, and correcting the entries for contention; for each the first processor group and the second processor group, determining a calculated usage vector that includes an entry representing a count of used strands and an entry representing an aggregated usage of the first functionality; for each the first processor group and the second processor group, determining a capacity vector that includes an entry representing a count of total strands and an entry representing a capacity of the first functionality; and based on the first processor group calculated usage vector and capacity vector, and the second processor group calculated usage vector and capacity vector, and based on the thread resource demand vector, assigning the first software thread to one of a strand in the first processor group and a strand in the second processor group and executing the first software thread on the strand to which the first software thread is assigned.