Ok. Let's take an example: spawning threads in Java.
A thread in Java is essentially an anonymous (void) function without parameters. It is a procedure, that will run unhindered, do its thing and terminate. Cool. That's the best way to use threads.
But, there is also no immediate interaction. Then again, that's not so bad in Java, as it runs in a VM and all threads and instances are managed (actually, they're all globally available through the JNI). Like in C/C++, you have to give the tread a pointer to an object if you want it to communicate with it. And yes, it does have its own internal state (local vars).
On the other hand, it is of type Runnable (an interface), so you can also make a void function of that type and use that. That's how you can pass that pointer as parameter. If you want more from Java threads, things become complicated.
But you can do all those things already in Object Pascal for a few decades. And much better.