The thread will automatically terminate when it finishes executing the function for which it was created.
join is a weird word, it really means wait_for, which means waiting for the thread to finish.
If you want to save a stream for reuse, it is usually implemented by creating its function loop every time it reaches a wait state, where it receives a warning (wakes up) when something waits. At some point, it will be a completion request or a request that will lead to its completion.
source share