As for the use case, I've recently realized the need in using threads when I stumbled upon the problem of generating world chunks procedurally where generating a chunk could exceed the delta time. Basically I applied some basic mechanism to let world chunks generate themselves in the background. It didn't speed up generation in general but the freezes almost went away.
I've encountered several other issues with using threads, like ensuring that resources are accessed on the right time to avoid deadlocks etc. Say you want to get access to the same texture, different threads could try to access it, so I've become familiar with mutexes to try to resolve this issue:
mutex.lock()
# read/write something
mutex.unlock()
This is actually my first experience with using threads so I'm still figuring this stuff out...