This is very interesting, I appreciate all this information.
One thing I am taking out of this is that high level gameplay logic is not something that I really need to do multithreading on. I suppose were it would be most beneficial is when a certain function is called that carries out a low level taxing process. This particular process can then be broken down into "tasks" which can be put in a queue for the thread pools to process. In my head I am imagining this to give me much more precise control over what processes are multithreaded and which not.
I also like this idea of removing interaction between objects until computation is complete and then sending queued messages to objects. I have learned much!