Concurrency: If two or more problems are solved by a single processor.
multiple execution flows with the potential to share resources
Example: two threads competing for a I/O port.
the separation of tasks to provide interleaved execution
Concurrency solves the problem of having scarce CPU resources and many tasks. So, you create threads or independent paths of execution through code in order to share time on the scarce resource. Up until recently, concurrency has dominated the discussion because of CPU availability.
Parallelism: If one problem is solved by multiple processors.
splitting a problem in multiple similar chunks.
Example: parsing a big file by running two processes on every half of the file.
the simultaneous execution of multiple pieces of work in order to increase speed
Parallelism solves the problem of finding enough tasks and appropriate tasks(ones that can be split apart correctly) and distributing them over plentiful CPU resources. Parallelism has always been around of course, but it's coming to the forefront because multi-core processors are so cheap.