Really, I am not an expert, so please don't take my reply as if it was 100% correct. It is a long time I didn't use any broadcasting method (and threads). But here is how I understood this: the threads are used to make some computation at the same time. When a thread has finished working, it returns to the Main thread (not the Main activity).
So, if I understand it correctly, your UDP receiver is to declare in the Main thread (perhaps in a Service if you want it to be ran all time). After it was initialized, when it receives some packets, the UDP_PacketArrived sub is called. Then, you can start a new thread to make something in the background. If I understand it, you don't have to create a special thread where to declare the UDP receiver.
I hope this can help, a bit