Concurrency is the ability of a program to deal with multiple things simultaneously. For example, a browser that downloads files while rendering pages and doing million other things at the same time is a highly concurrent program. Concurrent computations may happen at the same physical time – this is called parallelism – it improves overall speed of execution. Concurrent computations can also happen in an interleaved manner: a CPU runs one task for some time, then runs another task, then continues with the first one from where it stopped. Programs use this approach to improve responsiveness and to do more things simultaneously than the number of available CPU cores.
Links: Concurrency (Wikipedia), Concurrent computing (Wikipedia).
Here's 2 amazing resources to learn Concurrent programming:
Seven Concurrency Models in Seven Weeks (pragprog.com)
paid • book • by Paul Butcher • 2014
This book is an excellent survey of different approaches to concurrency and parallelism: traditional threads and locks, functional programming, Clojure's separation of identity and state, the actor model, Communicating Sequential Processes (CSP), data parallelism, and the Lambda Architecture.
Java Concurrency in Practice (www.amazon.com)
paid • book • by Brian Goetz, Tim Peierls, Joshua Bloch, and others • 2006
This book is the best guide on concurrent programming with threads. It covers threads-and-locks fundamentals, concurrent collections, the producer-consumer pattern, and thread pools among other things, and gives a lot of practical advice on how to design, test, and debug multithreaded programs. Despite being focused on Java 5, the content applies to any other language and remains very much relevant today.