Concurrency occurs when program semantics allow two threads of execution to be executed in a simultaneous or interleaved manner.
Parallelism occurs when two program threads actually execute simultaneously.
By the way, I still have problems with the use of "non-determinism" here. Contrary to what you say, schedulers do not schedule threads randomly. But looked at from the perspectice of program semantics, that might as well be the case, which is (I think) the reason people keep bringing that up.