Juggling many tasks at once is getting increasingly important, and even though this is getting “easier” and there may be more motivation to learn such things earlier… Still gotta start with learning how to do one thing at a time.
Some languages have cheap threads, allowing each task to have its own, so even though it may be doing blocking operations (waiting for some message maybe), they won’t stop other tasks.
Others give up control while waiting (asynchronous). This makes for more difficult code but the language might not have cheap threads, so they they share a thread instead.
Others yet may be limited in ways that makes it easier to reason about what happens, allowing out of order or parallel execution without the programmer having to say so.
Additionally, tasks need to communicate with each other or access shared resources, all without breaking each other, getting in each other’s way, or getting stuck waiting for each other to finish
As for object oriented, I think that’s… a separate topic from concurrency.
It’s a group of patterns/techniques. Not all apply to all object oriented languages. And yes, most descriptions of what it is are impossible to understand and miss the point. (Or perhaps that’s me misunderstanding, how would I tell, right)
I’d say object-oriented means that objects (values) are responsible for their own behaviour, allowing other code that isn’t familiar with a particular value-type to interact through those behaviours. For example, a list is iterable, it’s something the value itself knows how to do, you pretty much ask it “please provide your elements one at a time”