Thread spawning or creation is determined by the application vendor at time of development. Intel has been promoting parallel or highly threading programming for quite some time now - include toolkits, samples, etc.

Thread scheduling\processing is done by processor - if a program is multithreaded, the processor handles what threads on what cores, etc. If multiple single threaded programs - the processor will attempt to distribute the applications across cores.

Priority or affinity of threads per core on the processor can be done at the operating system level (i.e. Windows TaskManager)