For program it is considered as execution on different processors. But actually, these processors are virtual - just simple time division. Let say, 1 ms real processor executes commands for first virtual processor, then 1 ms for second virtual, etc.
Also, there are some techniques, like HyperThreading from Intel, that can simultaneuosly execute 2 and more instructions for parallel threads on the same hardware processor. This approach can be applied only when these instructions from parallel threads require different resources of processor.