My slightly different take, specific to future directions of programming paradigms:
Concurrency is about writing your program such that it can be doing multiple things at once if the hardware supports it. Currently, most languages have fairly heavy and complicated mechanisms to allow the programmer to specify this (eg: threads with manual synchronization, OpenMP pre-processor directives, etc.).
As hardware improves, it's going to improve horizontally (more cores) rather than vertically (faster single core). This means apps will need to have "latent concurrency" in order to scale with "faster" hardware. Languages are currently trying to evolve to best support this, to be in the position of best language for future development.
C++0x is adding more built-in support for the "old" methods of programming concurrency. Various compiler vendors are adding "new" methods which abstract the threading model and allow run-time decisions on numbers of threads, etc. (based on the hardware of the machine); for Microsoft in particular, see F#, concurrency runtime, parallel extensions, etc.
Hope that helps.